zoukankan      html  css  js  c++  java
  • 从一碗小米粥谈装饰器模式,代理模式的区别

    代理与装饰器


    场景描述

    代理即代替意思,可替代原类的所有功能,即和原类实现相同的规范。代理模式和装饰器模式很像。

    每天清晨起来,紧张的洗漱之后,来到楼下的早餐店,我通常都会要一碗小米粥,这时候盛粥的大姐姐通常会问一句加不加糖,我回答不加,这时候我就会得到一碗热腾腾香喷喷的小米粥。

    基础实现

    一个小米粥的接口:

    publicinterface MilletCongee {
    
         /**
    
         * 打印小米粥中含有的成分
    
         */
    
        void printIngredient ();
    
    }

    默认的不加糖的小米粥的实现:

    public class GeneralMilletCongee implements MilletCongee{
    
    	@Override
    	public void printIngredient() {
    		System.out.println("小米粥");
    	}
    
    }

    点餐:

    public class Order {
    
    	public static void main(String[] args) {
    		MilletCongee milletCongee=new GeneralMilletCongee();
    		milletCongee.printIngredient();
    	}
    
    }

    一碗小米粥,不加糖:

    装饰器模式


    得到一碗热腾腾香喷喷的小米粥,尝了一口,感觉不是很好喝,接着又尝了一口,嗯感觉还是加点糖比较好,于是我又来到盛小米粥的大姐姐旁边,让她帮我加了点糖。

    /**
     * 糖装饰器,用来给小米粥加糖
     */
    public class SugarDecorator implements MilletCongee {
    
        /**
         * 拥有的小米粥对象
         */
        private final MilletCongee milletCongee;
    
        public SugarDecorator(MilletCongee milletCongee) {
            this.milletCongee = milletCongee;
        }
    
    	@Override
        public void printIngredient() {
    		System.out.println("糖");
            this.milletCongee.printIngredient();
        }
    
    }

    大姐姐把加好糖的小米粥重新递给了我,尝了一口,嗯真是香甜可口。

    public class Order {
    
    	public static void main(String[] args) {
    		MilletCongee milletCongee=new GeneralMilletCongee();
    		milletCongee=new SugarDecorator(milletCongee);
    		milletCongee.printIngredient();
    		
    	}
    
    }

    看了一下小米粥的成分,加上了糖。

    注意这两行:

    MilletCongeemilletCongee=new GeneralMilletCongee();//点了一碗小米粥milletCongee=newSugarDecorator(milletCongee);//给小米粥加了点糖

    装饰器模式适合什么场景呢?假设我有一个对象,但是这个对象的功能不能令我满意,我想给他加上一些功能,如何才能实现呢,那我就拿装饰器给他装饰一下就ok了。

     代理模式


    第二天早上,吃早餐的时候我又点了一碗小米粥,这时候盛粥的大姐姐抛出了昨天同样的问题给我,加不加糖?想起昨天的情景和味道,感觉还是加糖好一点,我干净利落的回答道,加。

    
    public class MilletCongeeWithSugar implements MilletCongee {
        
    	private final MilletCongee milletCongee;
    
        public MilletCongeeWithSugar() {
            this.milletCongee = new GeneralMilletCongee();
        }
    	
    	@Override
    	public void printIngredient() {
    		System.out.println("糖");
            this.milletCongee.printIngredient();
    	}
    
    }

    这是加糖的小米粥,内部仍然是普通的小米粥,加了糖之后就产生了一个新的种类,叫加糖的小米粥。

    直接点加糖的小米粥:

    public class Order {
    
    	public static void main(String[] args) {
    		MilletCongee milletCongee=new MilletCongeeWithSugar();
    		milletCongee.printIngredient();
    	}
    
    }

    拿到加糖的小米粥尝了一口,嗯正合我意,香甜可口的一碗小米粥下肚,又是一个元气满满的早晨。

    区别


    装饰器模式和代理模式,都是对原对象进行包装,都需要用到原对象的实例,他们的区别主要在于对外的表现不同。

    装饰器模式:点了小米粥,发现不好喝,然后用装饰器加了点糖。MilletCongeemilletCongee=new GeneralMilletCongee();//点了一碗小米粥milletCongee=newSugarDecorator(milletCongee);//给小米粥加了点糖​​​​​
    代理模式:直接就点加了糖的小米粥MilletCongeemilletCongee=new MilletCongeeWithSugar();

    原创不易大家,点赞转发支持一下呀! 

  • 相关阅读:
    Spring Boot SockJS应用例子
    Spring Boot+STOMP解决消息乱序问题
    Spring boot集成Websocket,前端监听心跳实现
    吐槽Windows 8,就没见过这么烂的平板操作系统
    怎样在MyEclipse上耍Chrome
    HDOJ 4876 ZCC loves cards
    IIS7.5 配置 PHP 5.3.5
    关于ANDROID模拟器的一些事
    性能測试命令字段解释
    排序算法复习
  • 原文地址:https://www.cnblogs.com/yangxianyang/p/13675585.html
Copyright © 2011-2022 走看看