1. 程式人生 > >模版方法模式,迭代器模式,組合模式,狀態模式,代理模式

模版方法模式,迭代器模式,組合模式,狀態模式,代理模式

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物件

https://www.cnblogs.com/gonjan-blog/p/6685611.html