【精】代理模式Pk装饰模式

精辟概括:

代理模式:控制实现类的流程,层层把关,就像一个生产流水线一样,每一个环节都需要特定的检查,如果不符合,就出局。

                    所以,代理模式的精髓就是“控制流程”

装饰模式:不在改变接口的情况下,我们为接口的实现类添加了新的功能!


下面分析案例你会更清晰:

代理模式:


现在有一个需求了,一个顾客去市场买了一个西红柿,西红柿上标着德国进口,但是顾客无法辨别,再者,顾客向知道这个西红柿是不是安全的,顾客也没法辨别,于是需求就有了,我们的核心类:FootCheckAgent--》食品检查代理,隆重出场。他帮你搞定一切,让你吃得放心。

下面给上代码,

代码清单1:IFoot接口

public interface IFood {
   //是个食品肯定都能吃。。。。
   public void eat();
}


代码清单2:Tomato类

public class Tomato implements IFood{

	@Override
	public void eat() {
		System.out.println("吃西红柿");
	}
}


代码清单3:FoodCheckAgent

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();
	}
}


代码清单:输出语句

为产品添加防腐剂
为产品添加香料
吃西红柿

看完了这些,你应该能体会那句概括了:

装饰模式:不在改变接口的情况下,我们为接口的实现类添加了新的功能!


希望尽自己的微薄之力能帮到大家,那我就很高兴了。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值