網站首頁 編程語言 正文
1=繼承這個類通過子類重寫的方式增強
2=使用裝飾者模式
簡介:裝飾者模式是java23種設計模式之一,
裝飾模式是在不必改變原類文件和使用繼承的情況下,動態地擴展一個對象的功能。
它是通過創建一個包裝對象,也就是裝飾來包裹真實的對象
改變了傳統繼承增強對象功能所帶來的弊端.
使用前提:
1.需要裝飾類.
2.裝飾類和被裝飾類要有共同的父親.
3.裝飾類必須持有被裝飾類的對象.
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("學java");
}
@Override
public void run() {
System.out.println("每小時5公里");
}
}
===================================================
public interface Person {
public void eat();
public void sleep();
public void study();
public void run();
}
====================================================
//2.裝飾類和被裝飾類要有共同的父親.
public class SuperMan implements Person{
// 3.裝飾類必須持有被裝飾類的對象.
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("每小時10公里");
}
}
================================================
public class TestPerson {
public static void main(String[] args) throws FileNotFoundException {
// 1.需要裝飾類.
// 2.裝飾類和被裝飾類要有共同的父親.
// 3.裝飾類必須持有被裝飾類的對象.
// FileInputStream fis = new FileInputStream("a.txt");//被裝飾類
// BufferedInputStream bis = new BufferedInputStream(fis);//fis當做對象傳入了BufferedInputStream類中.
Man m = new Man();
SuperMan sm = new SuperMan(m);
showMan(m);
showMan(sm);
}
public static void showMan(Person p){
p.eat();
p.run();
}
}
3=使用動態代理模式
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("學java");
}
@Override
public void run() {
System.out.println("每小時5公里");
}
}
===============================================
/**
* 通過繼承是可以改變一個類的方法運行邏輯的.
*/
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();
//動態把man變成superman
/**
* 參數1: man.getClass().getClassLoader() 被代理對象的字節碼文件所屬的類加載器
* 參數2: man.getClass().getInterfaces() 被代理對象所實現的所有接口
* 參數3: new InvocationHandler(){} 監聽代理對象調用方法的監聽器.
*/
//superMan 是newProxyInstance()方法的返回值.返回的是代理對象.
Person superMan = (Person) Proxy.newProxyInstance(man.getClass().getClassLoader(), man.getClass().getInterfaces(), new InvocationHandler() {
/**
* @param proxy 代理對象
* @param method 代理對象正在執行的方法對象
* @param args 代理對象調用方法時傳入的參數
* 注意: InvocationHandler中的invoke()方法會在代理對象代用任何方法的時候都會執行.
* 執行時會自動給你傳入三個參數:
* * @param proxy 代理對象
* * @param method 代理對象正在執行的方法對象
* * @param args 代理對象調用方法時傳入的參數
*/
@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("每小時10公里");
return null;
}else{
return method.invoke(man,args);//不關心的方法.正常執行
}
}
});
showMan(superMan);
}
public static void showMan(Person p){
p.eat();
p.sleep();
p.run();
}
}
動態代理需要有接口
原文鏈接:https://blog.csdn.net/qq_37823919/article/details/122180411
相關推薦
- 2022-11-30 react源碼層探究setState作用_React
- 2022-10-23 python如何在一個py文件中獲取另一個py文件中的值(一個或多個)_python
- 2023-04-13 element UI中flex布局下el-table寬度自適應在IE下出現一直加載寬度的bug解決
- 2024-02-17 自定義Matplotlib中的顏色映射(cmap)
- 2022-12-09 CALL命令無法在PowerShell中使用的原因及解決方法_DOS/BAT
- 2022-05-29 C++中的類的大小詳解_C 語言
- 2022-10-03 C++深入探究重載重寫覆蓋的區別_C 語言
- 2022-09-19 Android實現多張圖片合成加載動畫_Android
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支