装饰器模式

装饰模式是一种用于在不修改原有对象的基础上增加对象功能的设计模式。它通过创建包装对象来扩展功能,允许动态组合多个装饰器以实现灵活的扩展。在抽象装饰类中,维护了对抽象构件对象的引用,并提供了统一的接口。具体装饰类则通过继承抽象装饰类并添加新行为来实现装饰。适配器模式则主要用于不同接口之间的转换,而装饰模式关注于增强功能。示例中展示了如何使用装饰模式为组件添加滚动条和黑色边框装饰。
摘要由CSDN通过智能技术生成

概念:(增加对象的一些功能)
动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活。装饰模式是一种对象结构型模式。
Component(抽象构件):它是具体构件和抽象装饰类的共同父类
ConcreteComponent(具体构件):它是抽象构件类的子类,用于定义具体的构件对象,实现了在抽象构件中声明的方法,装饰器可以给它增加额外的职责(方法)。
Decorator(抽象装饰类):它也是抽象构件类的子类,用于给具体构件增加职责,但是具体职责在其子类中实现。它维护一个指向抽象构件对象的引用,通过该引用可以调用装饰之前构件对象的方法,并通过其子类扩展该方法,以达到装饰的目的。
ConcreteDecorator(具体装饰类):它是抽象装饰类的子类,负责向构件添加新的职责。每一个具体装饰类都定义了一些新的行为,它可以调用在抽象装饰类中定义的方法,并可以增加新的方法用以扩充对象的行为
应用场景
在这里插入图片描述

装饰模式核心代码
	class Decorator implements Component
{
       private Component component;  //维持一个对抽象构件对象的引用
       public Decorator(Component component)  //注入一个抽象构件类型的对象
       {
              this.component=component;
       }
       public void operation()
       {
              component.operation();  //调用原有业务方法
       }
}

在抽象装饰类Decorator中定义了一个Component类型的对象component,维持一个对抽象构件对象的引用,
并可以通过构造方法或Setter方法将一个Component类型的对象注入进来,
同时由于Decorator类实现了抽象构件Component接口,因此需要实现在其中声明的业务方法operation(),
注意 的是在Decorator中并未真正实现operation()方法,而只是调用原有component对象的operation()方法,它没有真正实施装饰,而是提供一个统一的接口,将具体装饰过程交给子类完成。
在Decorator的子类即具体装饰类中将继承operation()方法并根据需要进行扩展,典型的具体装饰类代码如下:

class ConcreteDecorator extends Decorator
{
       public ConcreteDecorator(Component  component)
       {
              super(component);
       }
       public void operation()
       {
              super.operation();  //调用原有业务方法
              addedBehavior();  //调用新增业务方法
       } 
     //新增业务方法
       public  void addedBehavior()
       {    
         ……
}
}

在具体装饰类中可以调用到抽象装饰类的operation()方法,同时可以定义新的业务方法,如addedBehavior()。
由于在抽象装饰类Decorator中注入的是Component类型的对象,因此我们可以将一个具体构件对象注入其中,再通过具体装饰类来进行装饰;此外,我们还可以将一个已经装饰过的Decorator子类的对象再注入其中进行多次装饰,从而对原有功能的多次扩展。
demo:

	package wrapper;

/**
 * @Classname Component
 * @Description TODO
 * @Date 2021/4/5 18:15
 * @Created by 86386
 */
//抽象界面构件类:抽象构件类,为了突出与模式相关的核心代码,对原有控件代码进行了大量的简化

public abstract class Component
{
 public abstract void display();
}
//窗体类:具体构件类
class Window extends Component
{
public void display() {
System.out.println("显示窗体!");
 }
}
//文本框类:具体构件类
class TextBox extends Component
{
 public void display(){
     System.out.println("显示文本框!");
 }
}
//列表框类:具体构件类
class ListBox extends Component {
public void display(){
    System.out.println("显示列表框!");
}
}
//构件装饰类:抽象装饰类
class ComponentDecorator extends Component
{
private Component component; //维持对抽象构件类型对象的引用
public ComponentDecorator(Component component) //注入抽象构件类型的对象
{
this.component = component;
}
public void display() {
component.display();
}
}

//滚动条装饰类:具体装饰类
class ScrollBarDecorator extends ComponentDecorator{

 public ScrollBarDecorator(Component component)
 { super(component);
}
public void display()
{
this.setScrollBar();
super.display();
}
 public void setScrollBar()
{
 System.out.println("为构件增加滚动条!");
}
        }
        
//黑色边框装饰类:具体装饰类
class BlackBorderDecorator extends ComponentDecorator {
public BlackBorderDecorator(Component component)
 {
 super(component);
}

public void display()
{
this.setBlackBorder();
super.display();
}
public  void setBlackBorder()
{
System.out.println("为构件增加黑色边框!");
 }
 }
class Client {
 public static void main(String args[]) {
     Component component,componentSB,component1; //使用抽象构件定义
     component = new Window(); //定义具体构件
     componentSB = new ScrollBarDecorator(component); //定义装饰后的构件
     component1=new BlackBorderDecorator(componentSB);
     componentSB.display();
}
}

适配器模式与装饰器模式的区别
适配 器模式被用于桥接两个接口,(将一个接口转换为客户希望的另一个接口)
而装饰模式的目的是在不修改类的情况下给类增加新的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值