装饰模式介绍:
装饰模式(Decorator Pattern)也称为包装模式(Wrapper Pattern),结构型设计模式之一,其使用一种对客户端透明的方式来动态地扩展对象的功能,同时它也是继承关系的一种替代方案之一.在现实生活中你也可以看见很多装饰模式的例子,或者可以大胆地说装饰模式无处不在,就拿人来说,人需要各式各样的衣着,不管你穿着怎样,但是,对于个人的本质来说是不变的,这就是装饰模式,装饰物也许各不相同但是装饰的对象本质是不变的。
|装饰模式的定义:
动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式生成子类更为灵活。
装饰模式的使用场景:
需要透明且动态地扩展类的功能时。
一个装饰模式的通用模式代码。
//抽象组件类
角色介绍:
(1)Component:抽象组件。
可以是一个接口或抽象类,其充当的就是被装饰的原始对象。
(2)ConcreteComponent:组件具体实现类。
该类是Componcnt类的基本实现,也是我们装饰的具体对象。
(3)Decorator:抽象装饰者。
顾名思义,其承担的职责就是为了装饰我们的组件对象,其内部一定要有一个指向组件对象的引用。在大多数情况下,该类为抽象类,需要根据不同的装饰逻辑实现不同的具体子类.当然,如果装饰逻辑单一,只有一个的情况下我们可以省略该类直接作为具体的装饰者。
(4)ConcreteDecoratorA:装饰者具体实现类。
装饰模式(Decorator Pattern)也称为包装模式(Wrapper Pattern),结构型设计模式之一,其使用一种对客户端透明的方式来动态地扩展对象的功能,同时它也是继承关系的一种替代方案之一.在现实生活中你也可以看见很多装饰模式的例子,或者可以大胆地说装饰模式无处不在,就拿人来说,人需要各式各样的衣着,不管你穿着怎样,但是,对于个人的本质来说是不变的,这就是装饰模式,装饰物也许各不相同但是装饰的对象本质是不变的。
|装饰模式的定义:
动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式生成子类更为灵活。
装饰模式的使用场景:
需要透明且动态地扩展类的功能时。
一个装饰模式的通用模式代码。
//抽象组件类
public abstract class Component {
/**
* 抽象的方法,这个随你做
* 同样地你也可以增加更多的抽象方法
*/
public abstract void operate();
}
//组件具体实现类
public class ConcreteComponent extends Component
@Override
public void operate() {
//具体逻辑,这个随你做
}
}
// 抽象装饰者
public abstract class Decorator extends Component {
private Component component;//持有一个Component对象的引用
/*必要的构造方法需要一个component类型的对象
oparam componentComponent对象
*/
public Decorator(Component component) {
this.component = component;
}
@Override
public void operate() {
component.operate();
}
}
//装饰者具体实现类 // (注:ConcreteDecoratorB和ConcreteDecoratorA只是实现不同,因此ConcreteDecoratorB的代码这里不再给出)
public class ConcreteDecoratorA extends Decorator {
protected ConcreteDecoratorA(Component component) {
super(component);
}
@Override
public void operate() {
//装饰方法A和B既可在父类前调用也可在之后调用
operateA();
super.operate();
operateB();
}
//装饰方法A
private void operateB() {
}
//装饰方法B
private void operateA() {
}
}
//客户端
public class Client{
public static void main(String[] args){
//构造被装饰者的组件对象
Component component = new ConcreteComponent();
//根据组件对象构造装饰者对象A并调用,此时相当于给组件对象增加装饰者A的功能方法
Decorator decorator = new ConcreteDecoratorA(component);
decorator.operate();
//根据组件对象构造装饰者对象A并调用,此时相当于给组件对象增加装饰者A的功能方法
Decorator decoratorB = new ConcreteDecoratorB(component);
decoratorB.operate();
}
}
角色介绍:
(1)Component:抽象组件。
可以是一个接口或抽象类,其充当的就是被装饰的原始对象。
(2)ConcreteComponent:组件具体实现类。
该类是Componcnt类的基本实现,也是我们装饰的具体对象。
(3)Decorator:抽象装饰者。
顾名思义,其承担的职责就是为了装饰我们的组件对象,其内部一定要有一个指向组件对象的引用。在大多数情况下,该类为抽象类,需要根据不同的装饰逻辑实现不同的具体子类.当然,如果装饰逻辑单一,只有一个的情况下我们可以省略该类直接作为具体的装饰者。
(4)ConcreteDecoratorA:装饰者具体实现类。
只是对抽象装饰者作出具体的实现。
(5)ConcreteDecoratorB:同上。
(6)Client::客户端