您的位置:首页 > 其它

设计模式之装饰模式原理及实例(简单讲解)

2019-08-22 15:14 239 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/qq_38760398/article/details/100015432

装饰模式

在软件设计中,装饰模式是一种用于替代继承的技术,它通过一种无须定义子类的方式给对象动态的增加职责,使用对象之间的关联关系取代类之间的基础关系。在装饰模式中引入了装饰类,在装饰类中既可以调用未被装饰的原有类的方法,还可以增加新的方法,以扩充原有类的功能。

装饰模式的结构:

  1. Component(抽象构件):它是具体构件和抽象装饰类的共同父亲,声明了在具体构件中实现的业务方法,它的引入可以使客户端以一致的方式处理未被装饰的对象以及装饰后的对象,实现客户端的透明操作。
  2. ConcreteComponent(具体构件):它是抽象构件类的子类,用于定义具体的构件对象,实现了在抽象构件中声明的方法,装饰类可以给它增加额外的职责(方法)。
  3. Decorator(抽象装饰类):它也是抽象构件类的子类,用于给具体构件增加职责,但是具体职责在其子类中实现,它维护一个指向抽象构件对象的引用,通过该引用可以调用装饰之前构件对象的方法,并通过其子类扩展该方法,以达到装饰的目的。
  4. ConcreteDecorator(具体装饰类):它是抽象装饰类的子类,负责向构件中添加新的职责。每一个具体装饰类都定义了一些新的行为,它可以调用在抽象装饰类中定义的方法,并可以增加新的方法用于扩充对象的行为。

装饰模式的简单实现:

在装饰模式中,抽象构件类一般设计为抽象类或者接口,在其中声明了抽象业务方法,当然也可以在抽象构件类中实现一些具体构件类都共有的业务方法。抽象构件类的典型代码如下:

[code]public abstract class Component{
public abstract void operation();
}

具体构件类作为抽象构件类的子类实现了在抽象构件类中声明的业务方法,通常在具体构建类中只提供基本功能的实现,一些复杂的功能需要通过装饰类进行扩展。其典型代码如下:

[code]public class ConcreteComponent extends Component{
public void operation(){
//基本功能的实现
}
}

装饰模式的核心在于抽象装饰类的设计,其典型代码如下:

[code]public class Decorator extends Component{
private Component component;//维持一个对抽象构件对象的引用
//注入一个抽象构件类型的对象,可以在客户端调用的时候注入
public Decorator(Component component){
this.component=component;
}

public void operation(){
component.opration();//调用原有业务方法,新增方法职责放到子类中扩展
}
}

在Decorator的子类(具体装饰类)中将继承operation()方法并根据需要进行扩展,典型的具体装饰类代码如下:

[code]public class ConcreteDecorator extends Decorator{
public ConcreteDecorator(Component component){
super(component);    //调用抽象装饰类的注入方法
}
public void operation(){
super.operation();   //先调用原有业务的方法,在父类中已经声明
addedBehavior();     //调用新增的业务方法
}

//新增的业务方法
public void addedBehavior(){
......
}
}

在具体装饰类中可以调用到抽象装饰类operation()方法,同时可以定义新的业务方法,例如addedBeHavior()。如果不希望该方法被客户端单独调用,可以将其可见性设置为私有。

下面一个简单的客户端调用代码:

[code]public class Client{
public static void main(String args[]){
Component component = new ConcreteComponent(); //创建一个具体构件
/*
*创建一个具体装饰类,并将具体构件注入,进行装饰,
*还可以对该具体构件进行多次装饰,就看实际情况了
*如下面还想要再次装饰
* Component componentD = new ConcreteDecoratorD(componentC);
*/
Component componentC = new ConcreteDecorator(component);

componentC.operation();//最后调用装饰完后的方法

}
}

以上就是装饰模式的简单原理和实例了,总结一下,装饰模式其实就是通过装饰类去使用原有的方法(类),并且给它们增加一些新的职责。

 

本文借鉴了刘伟老师的《Java设计模式》一书以及相关博客

https://www.geek-share.com/detail/2598898100.html

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: