• 结构型之装饰者模式


    序言

      装饰者模式能够在不使用创造子类的情况下,将对象的功能加以扩展,如果要撤销功能的话,也比较方便。
    在装饰者模式中,含有的角色:

    • 抽象构件角色:接口或者抽象类,给出了需要装饰的接口。
    • 具体构件角色:类,包含了被装饰者所有的功能。
    • 装饰角色:类,持有抽象构建角色的委托实例,并实现了抽象构件角色的接口。
    • 具体装饰角色:类,继承装饰角色,对于需要装饰的方法进行增强。

    1. 装饰者模式

      装饰者的结构如下图:

    ![](http://images2017.cnblogs.com/blog/946528/201708/946528-20170810162331417-1971852420.png)
    > **套路**: > 1. 创建1个抽象装饰类 > 2. 创建委托实例,由客户端初始化 > 3. 实现抽象构件接口,通过委托实例,与原来接口保持一致 > 4. 创建具体装饰类,继承抽象装饰类,对要增强的功能增强
    /**
     * 抽象构件角色,士兵战斗接口
     */
    public interface Fightable {
        //穿盔甲
        public void wearArmour();
        //佩剑
        public void carrySword();
    }
    
    /**
     * 具体构件角色,士兵
     */
    public class Soldier implements Fightable{
        public void wearArmour() {
            System.out.println("身穿连衣裙");
        }
        public void carrySword() {
            System.out.println("佩戴铅笔刀");
        }
    }
    
    
    /**
     * 抽象装饰角色,士兵装饰者
     */
    public class SoldierDecorator implements Fightable{
    
        private Fightable fightablePerson;
        public SoldierDecorator(Fightable fightablePerson){
            this.fightablePerson = fightablePerson;
        }
    
        //原封不动
        public void wearArmour() {
            fightablePerson.wearArmour();
        }
        //原封不动
        public void carrySword() {
            fightablePerson.carrySword();
        }
    }
    
    /**
     * 具体装饰者,士兵包裹类
     */
    public class SoldierWrapper extends SoldierDecorator {
        public SoldierWrapper(Fightable fightablePerson) {
            super(fightablePerson);
        }
    
        @Override
        public void wearArmour() {
            super.wearArmour();
            System.out.println("增强后---------");
            System.out.println("穿戴铠甲");
        }
    
        @Override
        public void carrySword() {
            super.carrySword();
            System.out.println("增强后-----------");
            System.out.println("佩戴七星宝刀");
        }
    }
    
    /**
     * 测试装饰者模式
     */
    public class DecoratorTest {
        @Test
        public void testDecorator(){
    
            SoldierWrapper soldierWrapper = new SoldierWrapper(new Soldier());
            soldierWrapper.carrySword();
            System.out.println("分割线------------");
            soldierWrapper.wearArmour();
        }
    }
    

    2. 简化装饰者模式

    1. 去掉抽象构件接口,抽象装饰类直接继承继承具体构件角色,即SoldierDecorator继承Solider
    2. 去掉抽象装饰类,具体装饰类直接实现抽象构件接口

    后记

  • 相关阅读:
    元组
    字典
    列表
    数据类型-字符串(str)
    python安装和首次使用
    javac++的stl解决重复的元素
    c++二分法求一个数的完全平方数
    双指针法----->求数组中两数之和
    java的二分法求一个数的平方根
    Java递归加上二分搜索将有序数组转化为平衡二叉树2
  • 原文地址:https://www.cnblogs.com/codebug/p/7339940.html
Copyright © 2020-2023  润新知