`

Decorator-装饰器模式-1

阅读更多

作用:装饰器模式,动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator 模式相比生成子类更为灵活。Java I/O 中就应用了这一模式(如FilterInputStream,FilterOutputStream)。

 示例-装饰器模式:

示例1(比较直观)

//------------------------------------------接口Work 和类SquarePeg ---------------------------------------------------------------

 

package decorator_1;

public interface Work

{

    public void insert();

}

 

package decorator_1;

 

public class SquarePeg implements Work{

    public void insert(){

    System.out.println("方形桩插入");

    }

}

/*

 * 接口Work有一个具体实现:插入方形桩或圆形桩,这两个区别对Decorator

 *无所谓.我们以插入方形桩为例

 */

//------------------------------------------Decorator---------------------------------------------------------------

package decorator_1;

public class Decorator implements Work {

    private Work work;

    // 在构造器中使用组合new方式,引入Work对象;

    public Decorator(Work work) {

       this.work = work;

    }

    public void insert() {

       System.out.println("挖坑");

       work.insert();

       System.out.println("钉木板");

    }

}

/*

 * 现在有一个应用:需要在桩打入前,挖坑,在打入后,在桩上钉木

 */

//------------------------------------------测试类---------------------------------------------------------------

package decorator_1;

public class Main {

    public static void main(String[] args) {

       Work work1 = new SquarePeg();

       work1.insert();

       System.out.println("--------经过装饰后~----------");

       Work work2 = new Decorator(work1);

       work2.insert();

    }

}

示例2(比较实际)

类一览表;

名称

说明

Display

打印字符串的抽象类

StringDisplay

只有一行的打印字符串用的类-相当于核心对象

Border

表示“装饰外框”的抽象类-装饰器抽象类

SideBorder

在左右外框加上装饰外框的类-装饰器具体类1

FullBorder

在上下外框加上装饰外框的类-装饰器具体类2

Main

测试用的类

 类图查看图片附件:类图-Decorator _1

//------------------------------------------ Display---------------------------------------------------------------

package decorator_2;

public abstract class Display{

    public abstract int getColumns();//取得横向的字数

    public abstract int getRows();//取得纵向的行数

    public abstract String getRowText(int row);//取得第row个字符串

    public final void show(){            //打印所用内容

           for (int i = 0; i < getRows(); i++){

              System.out.println(getRowText(i));//row==0,设计是从这里开始的~~

           }

    }  

}

//------------------------------------------ StringDisplay---------------------------------------------------------------

package decorator_2;

public class StringDisplay extends Display{

    private String string;

    public StringDisplay(String string){

       this.string = string;

    }

    public int getColumns(){

       return string.getBytes().length;

    }

    public int getRows(){

       return 1; 

    }

    public String getRowText(int row){

       if (row == 0) {

           return string;

       } else {

           return null;

       }

    }

   

}

//------------------------------------------ Border---------------------------------------------------------------

package decorator_2;

public abstract class Border extends Display{

    protected Display display; //指定装饰外框里面的内容

    protected Border(Display display){//在产生对象实例时,以参数内容指定内容

           this.display = display;

    }  

}

//------------------------------------------ SideBorder---------------------------------------------------------------

package decorator_2;

public class SideBorder extends Border{

    private char borderChar; //装饰字符

    public SideBorder(Display display, char ch){

           super(display);//以构造函数指定Display和装饰字符

           this.borderChar = ch;

    }

    public int getColumns() {//字符要加上内容两边的装饰字符

       return 1 + display.getColumns() + 1;  

    }

    public int getRows(){     //行数同内容的行数

       return display.getRows();

    }

    public String getRowText(int row){//指定该行的内容,即在内容指定行的两边加上装饰字符

       return borderChar + display.getRowText(row) + borderChar;

    }

      

}

//------------------------------------------ FullBorder---------------------------------------------------------------

package decorator_2;

public class FullBorder extends Border{

       public FullBorder(Display display){

           super(display);

       }

       public int getColumns(){ //字数=内容字数+内容两边的装饰字符

           return 1 + display.getColumns() + 1;  

       }

       public int getRows(){  //行数=内容行数+上下是装饰字符

           return 1 +  display.getRows() + 1;

       }

       public String getRowText(int row){  //指定该行的内容

           if (row == 0) {//外框顶端

              return "+" + makeLine('-',display.getColumns()) + "+";     

           } else if (row == display.getRows() + 1) {//外框底端

              return "+" + makeLine('-',display.getColumns()) + "+";

           }else{//其他部分

              return "|" + display.getRowText(row - 1) + "|";

           }

       }

       private String makeLine(char ch, int count){//已字符ch,建立重复count次的连续字符串

              StringBuffer buf = new StringBuffer();

              for(int i =0; i < count; i++){

                     buf.append(ch);

              }

              return buf.toString();

       }

      

}

//------------------------------------------测试类---------------------------------------------------------------

package decorator_2;

public class Main{

    public static void main(String[] args){

           Display b1 = new StringDisplay("Hello ,world.");//打印“Helloworld”没有任何装饰

           b1.show();

           Display b2 = new SideBorder(b1, '#');//把装饰符”#“加在b1的两边

           b2.show();       

           Display b3 = new FullBorder(b2); //b2去不加上装饰外框

           b3.show();

//         Display b4 =

//                       new SideBorder(

//                          new FullBorder(

//                              new FullBorder(

//                                 new SideBorder(

//                                    new FullBorder(

//                                       new StringDisplay("您好。")

//                                    ),

//                                    '*'

//                                 )

//                              )

//                          ),

//                          '/'

//                       );

//         b4.show();

          

    }  

}

解析:

装饰器模式对装饰外框和内容是一视同仁的,就如在程序示例中表示装饰外框的Border类是表示内容的Display的子类,这既是一视同仁,换句话说,Border类(及其子类)具有内容表示内容类Display相同的接口。

装饰器模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性。动态给一个对象增加功能,这些功能可以再动态的撤消,增加由一些基本功能的排列组合而产生的非常大量的功能。就如我们每个人穿衣服一样,我们个体是不变的核心对象,穿上不同样式的衣服(这就是装饰),就能完成我们想要的视觉效果(所需的对象)。

 

 

  • 大小: 41.6 KB
  • 大小: 32.4 KB
分享到:
评论

相关推荐

    c++设计模式-结构型模式-装饰器模式

    c++设计模式-结构型模式-装饰器模式;QT工程;c++简单源码; 装饰器(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。

    设计模式-装饰器模式

    装饰器模式是一种结构型设计模式,它允许在不修改对象本身的情况下动态地为对象添加新的行为或职责。这种模式在软件工程中广泛应用,特别是在需要扩展已有功能而不影响原有代码结构时。在iOS开发中,装饰器模式同样...

    java常用设计模式-装饰器模式

    装饰器模式(Decorator Pattern)是一种结构性设计模式,它允许您在不影响同一类的其他对象的行为的情况下,静态或动态地向单个对象添加行为。该模式非常有用,当您想要在运行时添加或删除对象的功能时,或者当您想...

    decorator-4.1.2.tar.gz

    装饰器(Decorator)在Python编程语言中是一种强大的设计模式,它允许我们动态地修改或增强函数、类或对象的行为。`decorator-4.1.2.tar.gz` 是一个特定版本(4.1.2)的装饰器库的归档文件,这个库专门用于支持...

    9.设计模式-装饰器模式1

    装饰器模式(Decorator Pattern)是一种结构型设计模式,它的核心思想是在不修改原有对象的前提下,通过包装(包裹)原对象并扩展其行为来增加功能。这种模式常用于在运行时动态地给对象添加新的职责,使得系统具有...

    装饰器(Decorator)模式

    在《Element of Reusable Object-Oriented Software》中,GOF 对装饰器模式的用意进行了概述:Decorator Pattern――Attaches additional responsibilities to an object dynamically. Decorators provide a ...

    装饰器模式[Decorator]

    装饰器模式(Decorator)是一种设计模式,它允许在运行时向对象添加新的行为或责任,而无需修改对象的源代码。这种模式属于结构型模式,是面向对象设计中的一种非常实用的技术。 装饰器模式的核心思想是通过将一个...

    PHP设计模式(八)装饰器模式Decorator实例详解【结构型】

    装饰器模式(Decorator Pattern)是一种结构型设计模式,主要用于在运行时动态地给对象添加新的职责或行为,而不必改变现有对象的类定义。在面向对象编程中,装饰器模式提供了一种相对于继承更加灵活的方式来增强或...

    HeadFirst 设计模式学习笔记3--装饰模式 Demo

    装饰模式的运作过程通常是这样的:首先创建一个Concrete Component对象,然后通过一系列具体装饰器来包装这个对象,每次添加一个新的装饰器,就会为原对象增加一层新的功能。因为装饰器和具体组件都实现了相同的接口...

    设计模式--装饰者模式java例子

    1. **组件(Component)**:定义了对象的接口,也就是所有被装饰对象和装饰器对象必须共同遵循的公共行为。这个接口使得装饰者和被装饰的对象可以互换,实现了无缝对接。 2. **具体组件(Concrete Component)**:...

    java版本二十三种设计模式.zip

    - 装饰器模式(Decorator) - 桥接模式(Bridge) - 组合模式(Composite) - 外观模式(Facade) - 享元模式(Flyweight) - 观察者模式(Observer) - 模板方法模式(Template Method) - 策略模式(Strategy) - 责任链...

    jouryfirst#weekly-1#175.精读《设计模式 - Decorator 装饰器模式》1

    “就增加功能来说,Decorator 模式相比生成子类更为灵活” 这句话的含义是,组合比继承更灵活,当可拓展的功能很多时,继承方案会产生大量的子类,而组合可以提

    通过C#实现设计模式-装饰模式(DecoratorPattern).rar

    3、定义一个抽象的装饰器类Decorator,它实现了IComponent接口,并持有一个IComponent的引用。 4、创建具体的装饰器类了。例如,一个ConcreteDecoratorA类,它添加了额外的行为。 5、创建另一个装饰器...

    c++-设计模式之装饰模式(Decorator)

    具体装饰器(Concrete Decorator):扩展装饰器的功能,提供额外的行为 总结 装饰模式通过在运行时动态地为对象添加功能,增强了系统的灵活性和可扩展性。它允许在不修改现有代码的情况下添加新的行为,非常适合于...

    Python库 | json_log_decorator-2.0.0.tar.gz

    总之,`json_log_decorator-2.0.0`是一个实用的Python库,它通过装饰器模式简化了JSON日志的创建,提升了日志的可读性和分析性。无论是在小型项目还是大型系统中,合理利用日志都能极大地提高问题排查效率,而`json_...

    设计模式---装饰者模式

    这种模式的核心思想是通过将对象封装在一个装饰器对象内,来扩展对象的功能,同时保持原有接口的不变,从而实现对对象功能的灵活扩展。 在Java、C#等面向对象编程语言中,装饰者模式通常涉及四个主要角色: 1. **...

    设计模式之装饰模式(Decorator Pattern)

    4. **具体装饰器(Concrete Decorator)**:实现了装饰器接口,为组件增加新的行为或属性。每个具体装饰器都对应一种特定的扩展功能。 装饰模式的优点在于其灵活性,它可以独立于原始对象进行扩展,不需要修改原有...

    23种设计模式--装饰模式

    然后,我们可以通过装饰模式添加如拼写检查(Concrete Decorator A)、语法高亮(Concrete Decorator B)等功能,而无需修改原有的文本编辑器类。 总的来说,装饰模式是一种优雅且灵活的设计模式,它避免了过多的类...

    2 装饰器模式-MOOC课程内容.pdf

    装饰器模式是一种设计模式,它的核心思想是动态地给一个对象添加一些额外的职责。这种方式提供了一种扩展原有对象功能的方式,而且并不需要修改原有对象的代码,符合开闭原则(对扩展开放,对修改封闭)。 在装饰器...

    decorator-pattern:带有单一测试的装饰器模式演示

    装饰器模式(Decorator Pattern)是设计模式中的一种结构型模式,它允许在运行时动态地给对象添加新的职责或功能,而无需修改原有代码。在Java中,装饰器模式经常被用来扩展类的功能,同时也保持了类的接口不变,...

Global site tag (gtag.js) - Google Analytics