设计模式(四):装饰模式

设计模式(四):装饰模式

一、概念

装饰模式又被称为包装模式。通过对客户端透明的方式来拓展对象的功能,是继承关系的一种替代方案

装饰者模式类图

二、实现

假设,现在要给QQ秀里的人物设计装扮衣服,每个人可按自己不同的喜好搭配不同的衣服。

  1. 先创建Person类,它里面有一个show()展示(也是穿衣服)的方法

    public class Person {
        private String name;
        public Person() {
        }
        public  Person(String name){
            this.name=name;
        }
        //后面集成的子类都要覆盖该方法
        public void show(){
            System.out.println("装扮的"+name);
        }
    }
    
  2. 再创建一个FineryDecorator的装饰类,继承Person类

    public class FineryDecorator extends Person {
        protected Person component;//关联Person,二者是聚合关系
        public void decorate(Person component){
            this.component=component;
        }
        @Override
        public void show(){
            component.show();
        }
    }
    
  3. 相继创建各种各样的衣服类,都继承与FineryDecorator装饰类

    //T恤
    public class TShirts extends FineryDecorator {
        @Override
        public void show(){
            System.out.print("T恤 ");//关键代码,穿T恤
            super.show();
        }
    }
    //大垮裤
    public class BigTrouser extends FineryDecorator {
        @Override
        public void show(){
            System.out.print("大垮裤 ");//关键代码,大垮裤
            super.show();
        }
    }
    //后面的类,以此类推
    /**
    	....
    */
    
  4. 检验成果,测试:

    public static void main(String[] args) {
        Person p=new Person("Tom");
        System.out.println("第一种装扮:");
        TShirts tShirts=new TShirts();
        Tie tie=new Tie();
        Shoes shoes=new Shoes();
    
        tShirts.decorate(p);
        tie.decorate(tShirts);
        shoes.decorate(tie);
        shoes.show();
    
        System.out.println("第二种装扮:");
        Suit suit=new Suit();
        BigTrouser bigTrouser=new BigTrouser();
        Shoes shoes1=new Shoes();
        suit.decorate(p);
        bigTrouser.decorate(suit);
        shoes1.decorate(bigTrouser);
        shoes1.show();
    }
    

    运行截图:C:\Users\TYS\AppData\Roaming\Typora\typora-user-images

三、总结

    装饰者模式可以动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
    装饰者和被装饰者之间必须是一样的类型,也就是要有共同的超类。在这里应用继承并不是实现方法的复制,而是实现类型的匹配。因为装饰者和被装饰者是同一个类型,因此装饰者可以取代被装饰者,这样就使被装饰者拥有了装饰者独有的行为。根据装饰者模式的理念,我们可以在任何时候,实现新的装饰者增加新的行为。如果是用继承,每当需要增加新的行为时,就要修改原程序了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值