zoukankan      html  css  js  c++  java
  • 结构型之装饰者模式

    序言

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

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

    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. 去掉抽象装饰类,具体装饰类直接实现抽象构件接口

    后记

  • 相关阅读:
    leetCode 42.Trapping Rain Water(凹槽的雨水) 解题思路和方法
    FizzBuzz and Fibonacci优化
    mysql 存储过程 演示样例代码
    《深入理解Android 卷III》第二章 深入理解Java Binder和MessageQueue
    jsp中URL传递中文參数的处理
    键盘录入多名学生的信息: 格式:姓名,数学成绩,语文成绩,英文成绩,按总分由高到低 将学生的信息进行排列到文件里
    iOS_block代码块
    自己动手写android图片异步载入库
    三分钟教你学Git(十三)
    文本文件打印类库(C#)
  • 原文地址:https://www.cnblogs.com/codebug/p/7339940.html
Copyright © 2011-2022 走看看