老师向同学们布置了家庭作业,小明很懒不想写。于是让同学帮他。小刚在小明的作业本上写好了,交给了老师。老师看到的是小明完成了作业。这个逻辑用代码怎么写?
首先我们需要定义一个完成作业的人类,大金主和卖命的分别继承这个类。
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元