设计模式之装饰器模式

装饰器模式

定义

装饰器模式又名包装(Wrapper)模式。装饰器模式以对客户端透明的方式拓展对象的功能,是继承关系的一种替代方案。

类图

image.png

角色

  1. 抽象构件(Component)角色:给出一个抽象接口,已规范准备接收附加责任的对象。
  2. 具体构件(ConcreteComponent)角色:定义一个将要接收附加责任的类
  3. 装饰(Decorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。
  4. 体装饰(ConcreteDecorator)角色:负责给构件对象“贴上”附加的责任。

示例

组件接口

接口定义了一个方法,获取组件的名称

package com.coderman.design.wrapper;

/**
 * @Author zhangyukang
 * @Date 2020/5/25 09:14
 * @Version 1.0
 **/
public interface Component {

    /**
     * 获取组件的名称
     * @return
     */
    String getName();

}

具体组件实现类A

package com.coderman.design.wrapper;

/**
 * 组件A
 * @Author zhangyukang
 * @Date 2020/5/25 09:16
 * @Version 1.0
 **/
public class ComponentImplA implements Component{

    private String name;

    public ComponentImplA(String name){
        this.name=name;
    }

    @Override
    public String getName() {
        return this.name;
    }
}

具体组件实现类B

package com.coderman.design.wrapper;

/**
 * 组件B
 * @Author zhangyukang
 * @Date 2020/5/25 09:17
 * @Version 1.0
 **/
public class ComponentImplB implements Component{


    private String name;

    public ComponentImplB(String name){
        this.name=name;
    }

    @Override
    public String getName() {
        return this.name;
    }
}

装饰器实现组件接口

package com.coderman.design.wrapper;

/**
 * 组件装饰器
 * @Author zhangyukang
 * @Date 2020/5/25 09:19
 * @Version 1.0
 **/
public abstract class ComponentDecorator implements Component{


    protected Component component;


    public ComponentDecorator(Component component){
        this.component=component;
    }

    @Override
    public String getName() {
        return component.getName();
    }
}

具体的装饰器A,这里新增一个方法appendName;

package com.coderman.design.wrapper;

/**
 * @Author zhangyukang
 * @Date 2020/5/25 09:22
 * @Version 1.0
 **/
public class ComponentDecoratorA extends ComponentDecorator{


    public ComponentDecoratorA(Component component) {
        super(component);
    }

    //增加额外的操作
    public void appendName(String name){
        System.out.println(this.component.getName()+name);
    }
}

具体的装饰器B,这里重写原来的getName方法;

package com.coderman.design.wrapper;

/**
 * @Author zhangyukang
 * @Date 2020/5/25 09:23
 * @Version 1.0
 **/
public class ComponentDecoratorB extends ComponentDecorator{

    public ComponentDecoratorB(Component component) {
        super(component);
    }

    @Override
    public String getName() {
        return super.getName()+"|append2";
    }
}

测试类

package com.coderman.design.wrapper;

/**
 * @Author zhangyukang
 * @Date 2020/5/25 09:24
 * @Version 1.0
 **/
public class WrapperTest {
    public static void main(String[] args) {
        ComponentImplA a = new ComponentImplA("A组件");
        ComponentDecoratorA componentDecoratorA = new ComponentDecoratorA(a);
        componentDecoratorA.appendName("append something");
        System.out.println( new ComponentDecoratorB(new ComponentImplB("B组件")).getName());
    }
}

输出结果

A组件append something
B组件|append2

理想的装饰器模式的装饰者接口跟组件接口应该保持一模一样,这样每次传入一个组件进去,都只对组件接口的各个方法增加功能,返回依旧由组件接口接收,这样调用同一个对象的同一个方法会有不同的实现,调用者完全不必要知道具体调用的是哪个对象,这个也称之为透明装饰器;

单的来理解的话,装饰器用来新加功能

# 设计模式  

评论

公众号:mumuser

企鹅群:932154986

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×