設計模式不管對於何種語言都是存在的,這裡介紹的是java的模式 裝飾者模式是在二次開發中應用比較多的一款模式,當然了用反射也是可以實現的,今天介紹的是裝飾模式,有興趣的朋友可以自己去瞭解一下反射是怎麼實現的。 在實際的開發中是無法拿到源碼的,代碼的可使用性也被final了,所以最常見的二次開發(二次 ...
設計模式不管對於何種語言都是存在的,這裡介紹的是java的模式
裝飾者模式是在二次開發中應用比較多的一款模式,當然了用反射也是可以實現的,今天介紹的是裝飾模式,有興趣的朋友可以自己去瞭解一下反射是怎麼實現的。
在實際的開發中是無法拿到源碼的,代碼的可使用性也被final了,所以最常見的二次開發(二次開發就是給原有的代碼中對功能做一些增強)就是通過裝飾模式來實現的效果,使用這個模式有一個前提就是:可以獲取到裝飾對象的實現的所有的介面才可以用此模式下麵大家可以直接可以看代碼了:
1 我這裡先定義了一個介面Car:
public interface Car { public void init(); public void start(); public void decread(); }
2.定義了一個原有的實現類carss;也就是我們說的要對其進行二次開發的產品源代碼:(這裡就是我們說的可以獲取可以實現的介面)
public final class Carss implements Car{ @Override public void init() { System.out.println("初始化"); } @Override public void start() { System.out.println("開始"); } @Override public void decread() { System.out.println("結束"); } }
3.要加入的功能 Ca類:這個是主要的,我們這裡以介面Car作為Ca的屬性
public class Ca implements Car{ Car car; public Ca(Car car) { this.car = car; } @Override public void init() { System.out.println("這是裝飾者模式的實現"); car.init(); } @Override public void start() { car.start(); } @Override public void decread() { car.decread(); } }
4.最後是實現的功能:
public class demo1 { public static void main(String[] args) { //這裡拿到了Carss的許可權是可以new的 Car car=new Ca(new Carss()); car.init(); car.start(); car.decread(); } }
這就是一個簡單的裝飾者模式:
裝飾者模式有一個問題就是當實現的介面方法過多,這樣就會對代碼造成過多的冗餘,這就有了動態代理模式:
動態代理模式的原理:虛擬機在記憶體中創建類似class文件,而前提是在創建的時候要通知虛擬機在創建的位元組碼文件上有多少方法
位元組碼的文件是就是我們熟知的class文件
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class demo1 { public static void main(String[] args) { /** * Jdk的代理模式 * newProxyInstance的參數 1.固定值:告訴虛擬機用哪個位元組碼載入器載入記憶體中創建的位元組碼文件 * 2.通知虛擬機正在被創建的位元組碼文件中應該有哪些方法 * 3.通知虛擬機正在被創建的位元組碼上的各個方法如何處理也就是如何增強 */ Car c=(Car)Proxy.newProxyInstance(demo1.class.getClassLoader(), Carss.class.getInterfaces(),new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // //System.out.println(method.getName()); //這裡就可以選擇自己需要的那些方法 if(method.getName().equalsIgnoreCase("start")) { method.invoke(new Carss(), args); System.out.println("這是通過動態代理添加的"); } else method.invoke(new Carss(), args); return null; } }); c.init(); c.start(); c.decread(); /*//這裡拿到了Carss的許可權是可以new的 Car car=new Ca(new Carss()); car.init(); car.start(); car.decread();*/ } }
今天的分享就到這裡了。喜歡這篇文章的朋友可以點個贊哦!!!!!!