zoukankan      html  css  js  c++  java
  • 装饰器模式

      装饰器模式,顾名思义,拘束将某个类重新装扮一下,使得它比原来更“漂亮”, 或者在功能上更强大,这就是装饰器模式所要达到的目的。但是作为原来的这个类的使用者,还不应该感受到装饰前和装饰后又什么不同,否则就破坏了原有类的结构了。

      装饰器模式有如下结构:

      • Component:抽象组件,定义了一组抽象的接口,规定这个被装饰类有哪些功能。

      • ConcreteComponent: 实现这个抽象组件的所有功能。

      • Decorator:装饰器角色, 它持有一个Component 对象实例的引用。

      • ConcreteDecorator:具体的装饰器实现者,负责实现装饰器角色定义的功能。

      好了,下面直接上代码:

      1、先定义一个抽象组件 Component:

    package com.hd.decorator;
    
    public interface Component {
        void Operation();
    }

      2、再实现这个抽象组件的功能

    package com.hd.decorator;
    
    public class ConcreteComponent implements Component {
    
        @Override
        public void Operation() {
            System.out.println("具体抽象组件的功能");
        }
    }

      3、定义一个装饰器类

    package com.hd.decorator;
    
    public class Decorator implements Component {
    
        protected Component component;
        public void setComponent(Component component){
            this.component = component;
        }
        @Override
        public void Operation() {
            if(component != null){
                component.Operation();
            }
            
        }
    }

      4、再定义装饰器的实现者:

    package com.hd.decorator;
    
    public class ConcreteDecoratorA extends Decorator {
    
        @Override
        public void Operation() {
            System.out.println("加上装饰功能A...");
            super.Operation();
        }
    }
    package com.hd.decorator;
    
    public class ConcreteDecoratorB extends Decorator {
    
        @Override
        public void Operation() {
            System.out.println("加上装饰功能B...");
            super.Operation();
        }
    }

      5、下面测试一下:

    package com.hd.decorator;
    
    public class TestDecorator {
    
        public static void main(String[] args) {
            Component c = new ConcreteComponent();
            ConcreteDecoratorA d1 = new ConcreteDecoratorA();
            ConcreteDecoratorB d2 = new ConcreteDecoratorB();
            
            d1.setComponent(c);
            d2.setComponent(d1);
            d2.Operation();
    
        }
    
    }

      结果如下:

    加上装饰功能B...
    加上装饰功能A...
    具体抽象组件的功能

      装饰器和适配器模式,他们看似都是起到包装一个类或者对象的作用,但是使用他们的目的很不一样。

      适配器模式的意思是要将一个接口转变成另一个接口,它的目的是通过改变接口来达到重复使用的目的; 而装饰器模式不是要改变被装饰对象的接口,而是恰恰要保持原有的接口,但是增强原有对象的功能,或者改变原有对象的处理方法而提升性能。所以这两个模式设计的目的是不同的。

  • 相关阅读:
    aix lvm_lv_vg
    Centos6.5 telnet wireshark
    Qt开发初步,循序渐进,preRequest for 蓝图逆袭
    CentOs文件实时同步
    Qt GUI开发实战初期
    linux环境开发私房菜
    linux GUI程序开发
    Centos6.5 Qt4开发 Cannot find -lGL QApplication not file or dir
    Centos6.5升级gcc for qt5.3.1
    对Socket CAN的理解(5)——【Socket CAN控制器的初始化过程】
  • 原文地址:https://www.cnblogs.com/xiexin2015/p/9038742.html
Copyright © 2011-2022 走看看