模版方法模式,迭代器模式,組合模式,狀態模式,代理模式
阿新 • • 發佈:2019-01-09
1.模版方法模式:在一個方法中定義一個演算法的骨架,而將一些步驟延遲到子類中,模版方法使得子類可以在不改變演算法結構的情況下,重新定義演算法中的某些步驟,還可以提供hook()讓子類決定是否執行某些步驟。比如sort中的Comparable介面。
2.迭代器模式就是集合的迭代器
3.組合模式允許你將物件組合成樹形結構來表現“整體/部分”層次結構。組合能讓客戶以一致的方式處理個別對象以及物件組合。比如樹的遍歷。
4.狀態模式允許物件在內部狀態改變時改變它的行為,物件看起來好像修改了它的類
5.代理模式
(1)靜態代理,很簡單不說了
(2)動態代理,在執行時生成代理類,比如有一個Person類,當它使用自身代理時,只能修改name,而不能修改score。
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; interface Person{ //jdk代理必須有介面,因為它要繼承Proxy類,而java不允許多繼承 void setName(String name); void setScore(String score); String getName(); String getScore(); } class PersonImpl implements Person{ private String name,score; //get,set,toString } class OwnerInvocationHandler implements InvocationHandler{ private Person person; //處理器持有真實的物件 OwnerInvocationHandler(Person person){ this.person=person; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (method.getName().equals("setScore")){ //自己不能設定自己的分數 return null; } else if (method.getName().startsWith("get")){ return method.invoke(person,args); } else if (method.getName().startsWith("set")){ return method.invoke(person,args); } else if (method.getName().startsWith("toString")){ return method.invoke(person,args); } return null; } } public class Test { static Person getOwnerProxy(Person person){ return (Person) Proxy.newProxyInstance( //使用Proxy類的靜態方法 person.getClass().getClassLoader(), //將Person的類載入器當引數 person.getClass().getInterfaces(), //將Person的介面當引數 new OwnerInvocationHandler(person)); //呼叫處理器 } public static void main(String[] args) { Person person=new PersonImpl(); Person proxy=getOwnerProxy(person); proxy.setName("張三"); //可以設定自己的名字 proxy.setScore("50"); //不能設定自己的分數 System.err.println(proxy); //Person{name='張三', score='null'} } }
原理,呼叫proxy.setScore("50"),
代理會掉用invoke(Object proxy,Method method,Object[] args)分別是代理類,方法,引數
然後return method.invoke(person,args),處理器持有真實的person物件