網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
1=繼承這個(gè)類(lèi)通過(guò)子類(lèi)重寫(xiě)的方式增強(qiáng)
2=使用裝飾者模式
簡(jiǎn)介:裝飾者模式是java23種設(shè)計(jì)模式之一,
裝飾模式是在不必改變?cè)?lèi)文件和使用繼承的情況下,動(dòng)態(tài)地?cái)U(kuò)展一個(gè)對(duì)象的功能。
它是通過(guò)創(chuàng)建一個(gè)包裝對(duì)象,也就是裝飾來(lái)包裹真實(shí)的對(duì)象
改變了傳統(tǒng)繼承增強(qiáng)對(duì)象功能所帶來(lái)的弊端.
使用前提:
1.需要裝飾類(lèi).
2.裝飾類(lèi)和被裝飾類(lèi)要有共同的父親.
3.裝飾類(lèi)必須持有被裝飾類(lèi)的對(duì)象.
public class Man implements Person {
@Override
public void eat() {
System.out.println("吃山珍海味");
}
@Override
public void sleep() {
System.out.println("睡大街");
}
@Override
public void study() {
System.out.println("學(xué)java");
}
@Override
public void run() {
System.out.println("每小時(shí)5公里");
}
}
===================================================
public interface Person {
public void eat();
public void sleep();
public void study();
public void run();
}
====================================================
//2.裝飾類(lèi)和被裝飾類(lèi)要有共同的父親.
public class SuperMan implements Person{
// 3.裝飾類(lèi)必須持有被裝飾類(lèi)的對(duì)象.
Man man ;
public SuperMan( Man man ){
this.man = man;
}
@Override
public void eat() {
man.eat();
}
@Override
public void sleep() {
man.sleep();
}
@Override
public void study() {
man.study();
}
@Override
public void run() {
System.out.println("每小時(shí)10公里");
}
}
================================================
public class TestPerson {
public static void main(String[] args) throws FileNotFoundException {
// 1.需要裝飾類(lèi).
// 2.裝飾類(lèi)和被裝飾類(lèi)要有共同的父親.
// 3.裝飾類(lèi)必須持有被裝飾類(lèi)的對(duì)象.
// FileInputStream fis = new FileInputStream("a.txt");//被裝飾類(lèi)
// BufferedInputStream bis = new BufferedInputStream(fis);//fis當(dāng)做對(duì)象傳入了BufferedInputStream類(lèi)中.
Man m = new Man();
SuperMan sm = new SuperMan(m);
showMan(m);
showMan(sm);
}
public static void showMan(Person p){
p.eat();
p.run();
}
}
3=使用動(dòng)態(tài)代理模式
public class Man implements Person {
@Override
public void eat() {
System.out.println("吃山珍海味");
}
@Override
public void sleep() {
System.out.println("睡大街");
}
@Override
public void study() {
System.out.println("學(xué)java");
}
@Override
public void run() {
System.out.println("每小時(shí)5公里");
}
}
===============================================
/**
* 通過(guò)繼承是可以改變一個(gè)類(lèi)的方法運(yùn)行邏輯的.
*/
public interface Person {
public void eat();
public void sleep();
public void study();
public void run();
}
=======================================================
public class TestPerson {
public static void main(String[] args) throws FileNotFoundException {
Man man = new Man();
//動(dòng)態(tài)把man變成superman
/**
* 參數(shù)1: man.getClass().getClassLoader() 被代理對(duì)象的字節(jié)碼文件所屬的類(lèi)加載器
* 參數(shù)2: man.getClass().getInterfaces() 被代理對(duì)象所實(shí)現(xiàn)的所有接口
* 參數(shù)3: new InvocationHandler(){} 監(jiān)聽(tīng)代理對(duì)象調(diào)用方法的監(jiān)聽(tīng)器.
*/
//superMan 是newProxyInstance()方法的返回值.返回的是代理對(duì)象.
Person superMan = (Person) Proxy.newProxyInstance(man.getClass().getClassLoader(), man.getClass().getInterfaces(), new InvocationHandler() {
/**
* @param proxy 代理對(duì)象
* @param method 代理對(duì)象正在執(zhí)行的方法對(duì)象
* @param args 代理對(duì)象調(diào)用方法時(shí)傳入的參數(shù)
* 注意: InvocationHandler中的invoke()方法會(huì)在代理對(duì)象代用任何方法的時(shí)候都會(huì)執(zhí)行.
* 執(zhí)行時(shí)會(huì)自動(dòng)給你傳入三個(gè)參數(shù):
* * @param proxy 代理對(duì)象
* * @param method 代理對(duì)象正在執(zhí)行的方法對(duì)象
* * @param args 代理對(duì)象調(diào)用方法時(shí)傳入的參數(shù)
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(method.getName()+"======================");
if(method.getName().equals("run")){
System.out.println("每小時(shí)10公里");
return null;
}else{
return method.invoke(man,args);//不關(guān)心的方法.正常執(zhí)行
}
}
});
showMan(superMan);
}
public static void showMan(Person p){
p.eat();
p.sleep();
p.run();
}
}
動(dòng)態(tài)代理需要有接口
原文鏈接:https://blog.csdn.net/qq_37823919/article/details/122180411
相關(guān)推薦
- 2022-03-29 redis的list數(shù)據(jù)類(lèi)型相關(guān)命令介紹及使用_Redis
- 2023-03-20 解讀C#中ReadString的一些小疑惑_C#教程
- 2022-05-08 PyTorch實(shí)現(xiàn)多維度特征輸入邏輯回歸_python
- 2022-03-15 could not open extension control file “/usr/pgsql-
- 2022-08-30 五個(gè)Python命令使用的小妙招分享_python
- 2023-11-19 如何將電腦復(fù)制的內(nèi)容粘貼進(jìn)MobaXterm?如何復(fù)制粘貼
- 2024-03-15 npm install報(bào)錯(cuò) Fix the upstream dependency conflict
- 2022-02-20 Spring Boot 打包報(bào)錯(cuò)Failed to execute goal org.apache.
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支