• 【设计模式】结构型02装饰模式(Decorator Pattern)


    装饰模式(Decorator Pattern)


    意图:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。

    主要解决:一般的,我们为了扩展一个类经常使用继承方式实现,由于继承为类引入静态特征,并且随着扩展功能的增多,子类会很膨胀。

    何时使用:在不想增加很多子类的情况下扩展类。


    以下是demo:

    这里我省略了消费者House类,直接使用核心实现方式进行解释:

    1、装饰类接口与装饰对象:

    package com.pat.decorator;
    /**
     * 装饰类接口-所有装饰类实现本接口
     * @author ZX
     *
     */
    public interface Decorator{
    	void decorat();
    }
    
    /**
     * 下面是所有的装饰对象,各自持有一个(根据实际情况)装饰对象
     * @author ZX
     * 
     *
     */
    class Sofa implements Decorator{
    	private Decorator decorator;
    
    	@Override
    	public void decorat() {
    		if(decorator!=null)
    		decorator.decorat();
    		System.out.println("装沙发");
    		
    	}
    	public Sofa() {}
    	public Sofa(Decorator decorator) {
    		this.decorator=decorator;
    	}
    	
    }
    class Desk implements Decorator{
    	private Decorator decorator;
    	@Override
    	public void decorat() {
    		if(decorator!=null)
    		decorator.decorat();
    		System.out.println("装桌子");
    		
    	}
    	public Desk() {}
    	public Desk(Decorator decorator) {
    		this.decorator=decorator;
    	}
    }
    package com.pat.decorator;
    
    public class Test {
    	public static void main(String[] args) {
    		Sofa sofa = new Sofa();
    		Desk desk = new Desk(sofa);
    		Computer com = new Computer(desk);
    		com.decorat();
    	}
    }
    

    class Computer implements Decorator{private Decorator decorator;@Overridepublic void decorat() {if(decorator!=null)decorator.decorat();System.out.println("装电脑");}public Computer() {}public Computer(Decorator decorator) {this.decorator=decorator;}}

    2、测试类:

    package com.pat.decorator;
    
    public class Test {
    	public static void main(String[] args) {
    		Sofa sofa = new Sofa();
                    Desk desk = new Desk(sofa);
    		Computer com = new Computer(desk);
    		com.decorat();
    	}
    }
    


  • 相关阅读:
    Java Swing TextArea 滚动条和获得焦点
    Windows下一个AndroidStudio 正在使用Git(AndroidStudio工程GitHub关联)
    我们将与操作系统工作谈一场无私的爱──《云情人》思考
    CSDN markdown 编辑 三 基本语法
    Android项目包装apk和apk反编译,xml反编译
    char (*(*p[3])( int ))[5] 等等一系列 左右法则
    typedef 优于 #define
    int *(*a[5])(int, char*)
    C++宏定义详解
    STL 案例分析
  • 原文地址:https://www.cnblogs.com/the-fool/p/11054137.html
Copyright © 2020-2023  润新知