设计模式之代理模式(静态代理)

老师向同学们布置了家庭作业,小明很懒不想写。于是让同学帮他。小刚在小明的作业本上写好了,交给了老师。老师看到的是小明完成了作业。这个逻辑用代码怎么写?

首先我们需要定义一个完成作业的人类,大金主和卖命的分别继承这个类。

public abstract interface Homeworker {
    //语文作业
    public abstract void chinese();
    //数学作业
    public abstract void math();
    //英语作业
    public abstract void english();
}

大金主呢它的类里有这些方法具体实现

public class Wealthy implements Homeworker {
    private String hName ;
    public Wealthy(String hName){
        this.hName = hName;
    }
    public void chinese() {
        System.out.println(hName+"写完了语文作业");
    }
    public void math(){
        System.out.println(hName+"写完了数学作业");
    }
    public void english() {
        System.out.println(hName+"写完了英语作业");
    }
}

卖命的呢它要在金主的本子上写

public class Server implements Homeworker {
    private Homeworker hw;
    Server(Wealthy wealthy)   { this.hw =wealthy; }
    public void chinese() { hw.chinese(); }
    public void math()    { hw.math(); }
    public void english() { hw.english(); }
}

再来看看场景

public class Client {
    public static void main(String[] args) {
        Wealthy wealthy = new Wealthy("小明");
        Server server = new Server(wealthy);
        server.chinese();
        server.math();
        server.english();
    }
}

结果很好,老师看到了跟小明自己写是一样的。都是
小明写完了语文作业 小明写完了数学作业 小明写完了英语作业
然后小刚的得到了钱,皆大欢喜这就是一个简单的代理模式。
代理模式的扩展
1.普通代理
小明成天找同学写作业,今天小刚明天小红后天小强慢慢就自己写不出来了,只能靠他的代理来完成。慢慢的大家也嫌把作业给小明交太麻烦就直接都替他完成了。让我们看看这段逻辑怎么写。
大金主变得在生成时必须知道他的代理是谁

public class Wealthy implements Homeworker {
    private String hName = "";
    public Wealthy(Homeworker hw,String hName) throws Exception {
        if(hw == null){
        throw  new Exception("不知道哪作业");
        }else {
            this.hName = hName;
        }
    }
    public void chinese() {
        System.out.println(hName+"写完了语文作业");
    }
    public void math(){
        System.out.println(hName+"写完了数学作业");
    }
    public void english() {
        System.out.println(hName+"写完了英语作业");
    }
}

而代理的构造也变成了这样

public class Server implements Homeworker {
    private Homeworker hw = null;
    Server(String hname)  {
        try {
            hw = new Wealthy(this,hname);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public void chinese() { hw.chinese(); }
    public void math()    { hw.math(); }
    public void english() { hw.english(); }
}

再看看场景,同学们熟练的写上了小明的名字交了上去。

public class Client {
    public static void main(String[] args) {
        Server server = new Server("小明");
        server.chinese();
        server.math();
        server.english();
    }
}

老师还是以为这些都是小明同学明完成的,但其实小明自己已经什么都写不出来了。
2.强制代理
小明找别的同学写作业别的同学告密,小刚嘴很紧,价格也公道。久而久之小明也就只找小刚了。我们看看这个逻辑该怎么实现。
金主类变成了这样,他必须知道自己的代理是谁

public class Wealthy implements Homeworker {
    private String hName = "";
    //代理代理,你在哪里。代理代理,我好想你。
    private Server proxy = null;

    public Wealthy(String hName) {
        this.hName = hName;
    }

    public void chinese() {
        if (haveProxy()) {
            System.out.println(hName + "写完了语文作业");
            proxy.benefit();
        } else {
            System.out.println("请使用小刚");
        }
    }
    public void math() {
        if (haveProxy()) {
            System.out.println(hName + "写完了数学作业");
            proxy.benefit();
        } else {
            System.out.println("请使用小刚");
        }
    }
    public void english() {
        if (haveProxy()) {
            System.out.println(hName + "写完了英语作业");
            proxy.benefit();
        } else {
            System.out.println("请使用小刚");
        }
    }
    public Server getProxy() {

        return proxy = new Server(this);
    }
    private boolean haveProxy() {
        return proxy == null ? false : true;
    }
}

卖命的,多了一个收款的方法,没钱谁还乐意干啊。

public class Server implements Homeworker {
    private static int money = 0;
    private Homeworker hw = null;
    Server(Wealthy wealthy)  {
       hw = wealthy;
    }
    public void chinese() { hw.chinese(); }
    public void math()    { hw.math();  }
    public void english() { hw.english();  }
    public void benefit(){money += 10;}
    public void price(){
        System.out.println("本次交易收款"+money+"元");
    }
}

情景呢?

public class Client {
    public static void main(String[] args) {
        Wealthy wealthy = new Wealthy("小明");
        //Server proxy = new Server(wealthy);
        //这样访问也不行这是new的代理不是小明的小刚
        Server proxy = wealthy.getProxy();//这才是小刚
        proxy.chinese();
        proxy.math();
        proxy.english();
        proxy.price();
    }
}

结果不错~
小明写完了语文作业
小明写完了语文作业
小明写完了数学作业
小明写完了英语作业
本次交易收款40元

猜你喜欢

转载自blog.csdn.net/qq_43313769/article/details/86421317