装饰模式

装饰模式定义

Attach additional responsibilities to an object dynamically keeping the same interface. Decorator provide a flexible alternative to subclassing for extending functionality (动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更为灵活)

装饰模式的通用类图

这里写图片描述

装饰模式通用代码展示与分析

抽象构件(被装饰的抽象类)

package decoratorpattern;

/**
 * 被装饰的抽象类
 * @author jeek
 *
 */
public abstract class Component {

    public abstract void operate();
}

具体构件(被装饰类)

package decoratorpattern;

public class ConcreateComponent extends Component {

    @Override
    public void operate() {
        // TODO Auto-generated method stub
        System.out.println("被装饰对象 do somethong!");
    }

}

装饰者抽象类

package decoratorpattern;

public abstract class Decorator extends Component {

    private Component component = null;

    public Decorator(Component _component) {
        this.component = _component;
    }
    @Override
    public void operate() {
        // TODO Auto-generated method stub
        this.component.operate();
    }

}

具体装饰者类1

package decoratorpattern;

public class ConcreateDecorator1 extends Decorator {

    public ConcreateDecorator1(Component _component) {
        super(_component);
    }

    //定义自己的修饰方法
    private void method1() {
        System.out.println("method1 修饰");
    }

    //重写父类的operate方法
    public void operate() {
        // TODO Auto-generated method stub
        this.method1();
        super.operate();

    }
}

具体装饰者类2

package decoratorpattern;

public class ConcreateDecorator2 extends Decorator {

    public ConcreateDecorator2(Component _component) {
        super(_component);
    }

    //定义自己的修饰方法
    private void method2() {
        System.out.println("method2 修饰");
    }

    //重写父类的operate方法
    public void operate() {
        super.operate();
        this.method2();
    }
}

客户端场景类

package decoratorpattern;

public class Client {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Component component = null;
        //被装饰对象
        component = new ConcreateComponent();
        //第一次装饰
        component = new ConcreateDecorator1(component);
        //第一次装饰
        component = new ConcreateDecorator2(component);
        //修饰后运行
        component.operate();
    }

}

输出结果为:
method1 修饰
被装饰对象 do somethong!
method2 修饰


抽象构件是一个接口或者是抽象类,就是定义我们最核心的对象即最原始对象。

具体构件是最核心最原始最基本的接口或抽象类的实现,也就是被装饰者。

装饰者抽象类(一般是抽象类不是接口)实现抽象构件(接口或抽象类)的方法,自由添加本类的自有方法,但是在它的属性里必须有一个私有变量指向被装饰者(一般通过构造函数传递被装饰者)

具体装饰者完成被装饰对象的动态功能添加


装饰模式优缺点场景分析

装饰模式又称装饰者模式,其实他是代理模式的一种特殊形式,从他们及其相似的通用类图就可看出来。
装饰类和被装饰类可以独立发展,不会耦合(易维护易扩展)。装饰模式是继承关系的一种替代,不管怎么装饰动态添加功能,返回的总是一个抽象组件指向的对象,总是一个is-a的关系。可以随时动态的扩展装饰者的功能。
装饰着最大的问题就是如果装饰层数过多,而最里层的装饰出现了问题,若要修改,想想看那将是一个很蛋疼的事

一般对一个对象或者类有功能的改装或加装的场景下首选装饰模式

java 的JRE里输入输出流包(即io包)就是典型的装饰着模式。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值