装饰器模式

作者: GeekerLou | 来源:发表于2020-03-08 10:55 被阅读0次

    装饰器模式

    装饰器模式中主要有两个角色:

    • 装饰器;
    • 被装饰的对象。
      用老王买装备的例子来说,老王就是被装饰的对象,而衣服、裤子、帽子等就是装饰器。

    装饰器和被装饰的对象有两个特点,也是装饰器模式的关键:

    • 他们实现同一个接口;
    • 装饰器中使用了被装饰的对象。

    使用装饰器模式的几个关键点:

    • 装饰器和被装饰类要实现同一个接口( 实际开发中也可能用继承 )。
    • 装饰器中的方法可以调用被装饰对象提供的方法,以此实现功能累加的效果,例如,夹克装饰器和帽子装饰器中调用了 person.cost() + xx 实现累计消费金额的累加。

    实例

    public interface Person {
        /**
         * 计算累计消费
         * @return
         */
        public Double cost();
        public void show();
    }
    
    /**
     * 抽象的服饰装饰器
     */
    public abstract class ClothesDecorator implements Person {
        //装饰器中要使用被装饰器的对象,构造方法中传入
        protected Person person;
    
        public ClothesDecorator(Person person) {
            this.person = person;
        }
    }
    
    /**
     * 被装饰的对象
     */
    public class LaoWang implements Person{
    
        @Override
        public Double cost() {
            return 0.0; //赤果果的时候累计消费为0
        }
    
        @Override
        public void show() {
            System.out.println("我是赤果果的老王");
        }
    }
    
    public class Jacket extends ClothesDecorator {
        public Jacket(Person person) {
            super(person);
        }
    
        @Override
        public void show() {
            person.show();
            System.out.println("穿上夹克,累计消费" + this.cost());
        }
    
        @Override
        public Double cost() {
            return person.cost() + 100; //夹克100元
        }
    }
    
    public class Hat extends ClothesDecorator {
        public Hat(Person person) {
            super(person);
        }
    
        @Override
        public void show() {
            //执行已有功能
            person.show();
            //此处是附加的功能
            System.out.println("戴上帽子,累计消费" + this.cost());
        }
    
        @Override
        public Double cost() {
            return person.cost() + 50; //帽子50元
        }
    }
    

    单元测试:

    import com.netease.learn.designPattern.decorator.Hat;
    import com.netease.learn.designPattern.decorator.Jacket;
    import com.netease.learn.designPattern.decorator.LaoWang;
    import com.netease.learn.designPattern.decorator.Person;
    import org.junit.Test;
    
    public class DecoratorTest {
    
        @Test
        public void test1() {
            Person laowang = new LaoWang();
    
            //穿上夹克
            laowang = new Jacket(laowang);
    
            //戴上帽子
            laowang = new Hat(laowang);
    
            laowang.show();
            System.out.println("买单,老王总共消费:" + laowang.cost());
        }
    }
    

    参考资料

    1. 代码仓库-装饰器模式

    相关文章

      网友评论

        本文标题:装饰器模式

        本文链接:https://www.haomeiwen.com/subject/kqcddhtx.html