美文网首页
装饰模式

装饰模式

作者: 忘净空 | 来源:发表于2016-08-17 17:59 被阅读15次

    模式定义

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

    模式结构

    模式结构

    Component:组件对象的接口,可以给这些对象动态地增加职责。
    ConcreteComponet:具体的组建对象,实现组件对象接口,通常就是被装饰器装饰的原始对象,也就是可以给这个对象添加职责。
    Decorator:所有装饰器的抽象父类,需要定义一个与组件接口一致的接口,并持有一个Component对象,其实就是持有一个被装饰的对象。
    ConcreteDecorator:实际的装饰器对象,实现具体要向被装饰对象添加的功能。

    代码实现

    //我们用颜色装饰下宝马车
    public interface Car {
        void detail();
    }
    
    public class BMW implements Car {
        public void detail() {
            System.out.println("宝马");
        }
    }
    
    public class Decorator implements Car {
        private Car car;
        public Decorator(Car car) {
            this.car = car;
        }
        public void detail() {
            car.detail();
        }
    }
    
    public class YellowCar extends Decorator {
    
        public YellowCar(Car car) {
            super(car);
        }
    
        @Override
        public void detail() {
            System.out.print("黄色");
            super.detail();
        }
    }
    
    public class BlackCar extends Decorator {
        public BlackCar(Car car) {
            super(car);
        }
    
        @Override
        public void detail() {
            System.out.print("黑色");
            super.detail();
        }
    }
    
    public class Client {
        public static void main(String[] args) {
            Car yellowCar =new YellowCar(new Decorator(new BMW()));
            yellowCar.detail();
    
            Car blackCar = new BlackCar(new Decorator(new BMW()));
            blackCar.detail();
        }
    }
    
    

    模式的优缺点

    优点

    1. 比继承更灵活
      从为对象添加功能的角度来看,装饰模式比继承更灵活。继承时静态的,而且一旦继承所有子类都有一样的功能。而装饰模式采用把功能分离到每个装饰器当中,然后通过对象组合的方式,在运行时动态地组合功能。

    2. 更容易复用功能
      装饰模式把一些列复杂的功能分散到每个装饰器当中,一般一个装饰器只实现一个功能,使实现装饰器变得简单,更重要的是这样有利于装饰器功能的复用,可以给一个对象添加多个同样的装饰器,也可以把一个装饰器用来装饰不同的对象。

    3. 简化高层定义
      装饰模式可以通过组合装饰器方式,为对象增添任意多的功能。因此在进行高层定义的时候,不用把所有的功能都定义出来,而是定义最基本的就可以了,可以在需要使用的时候,组合相应的装饰器来完成需要的功能。

    缺点

    1. 会产生许多细力度的对象。

    思考

    模式本质:动态组合。

    开发中的应用场景

    1. 如果需要在不影响其他对象的情况下,以动态、透明的方式给对象增加职责,可以失忆哦那个装饰模式,这几乎就是装饰模式的主要功能。

    2. 如果不适合使用子类来进行扩展的时候,可以考虑使用装饰模式。

    相关文章

      网友评论

          本文标题:装饰模式

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