精辟概括:
代理模式:控制实现类的流程,层层把关,就像一个生产流水线一样,每一个环节都需要特定的检查,如果不符合,就出局。
所以,代理模式的精髓就是“控制流程”
装饰模式:不在改变接口的情况下,我们为接口的实现类添加了新的功能!
下面分析案例你会更清晰:
代理模式:
现在有一个需求了,一个顾客去市场买了一个西红柿,西红柿上标着德国进口,但是顾客无法辨别,再者,顾客向知道这个西红柿是不是安全的,顾客也没法辨别,于是需求就有了,我们的核心类:FootCheckAgent--》食品检查代理,隆重出场。他帮你搞定一切,让你吃得放心。
下面给上代码,
代码清单1:IFoot接口
public interface IFood {
//是个食品肯定都能吃。。。。
public void eat();
}
public class Tomato implements IFood{
@Override
public void eat() {
System.out.println("吃西红柿");
}
}
public class FootCheckAgent implements IFood{
IFood foot=null;
public FootCheckAgent(IFood foot) {
super();
this.foot = foot;
}
@Override
public void eat() {
System.out.println("------------------------------------鉴定专家正在为您鉴定--------------");
if(isSafe()){
if(isForeign()){
//通过层层的检查,终于可是吃到放心产品了
System.out.println("鉴定专家:请放心吃");
this.foot.eat();
}
}
}
//检查是否安全:这里看具体业务,实现不同的返回值
public boolean isSafe(){
System.out.println("鉴定专家:恭喜您,你购买的食品是安全的!");
return true;
}
//检查是否是国外的食品。
public boolean isForeign(){
System.out.println("鉴定专家:恭喜您,你购买的是国外的产品");
return true;
}
//其他的检查。。。。。。。。。。。。。。。。。。。。。。。。
}
代码清单4:Client 客户端调用程序
public class Client {
public static void main(String[] args) {
System.out.println("------------------------------------购买了西红柿------------------");
IFood tomato=new Tomato();
System.out.println("外行人不懂,于是找鉴定代理免费帮忙查查");
IFood checkAgent=new FootCheckAgent(tomato);
checkAgent.eat();
}
}
代码清单5:输出语句
------------------------------------购买了西红柿------------------
外行人不懂,于是找鉴定代理免费帮忙查查
------------------------------------鉴定专家正在为您鉴定--------------
鉴定专家:恭喜您,你购买的食品是安全的!
鉴定专家:恭喜您,你购买的是国外的产品
鉴定专家:请放心吃
吃西红柿
如果你仔细的看完上面的内容,你就会体会那句概括了:
代理模式:控制实现类的流程,层层把关,就像一个生产流水线一样,每一个环节都需要特定的检查,如果不符合,就出局。
所以,代理模式的精髓就是“控制流程”
分析玩了代理模式,我们在来看装饰模式
装饰模式的类图和代码模式的类图几乎没有什么两样!!!!!
看!类图如此相似!!
代码清单,出了核心类FoodDeractor不一样之外,其他一模一样
代码清单:FoodDeractor
public class FoodDeractor implements IFood{
IFood food = null;
public FoodDeractor(IFood food) {
this.food = food;
}
@Override
public void eat() {
addPreservative();
addSpice();
this.food.eat();
}
//添加防腐剂
public void addPreservative(){
System.out.println("为产品添加防腐剂");
}
//添加香料
public void addSpice(){
System.out.println("为产品添加香料");
}
}
代码清单:客户端Client
public class Client {
public static void main(String[] args) {
IFood tomato=new Tomato();
IFood derector=new FoodDeractor(tomato);
derector.eat();
}
}
代码清单:输出语句
为产品添加防腐剂
为产品添加香料
吃西红柿
看完了这些,你应该能体会那句概括了:
装饰模式:不在改变接口的情况下,我们为接口的实现类添加了新的功能!
希望尽自己的微薄之力能帮到大家,那我就很高兴了。