• 设计模式——装饰模式(Decorator Pattern)


      装饰模式:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。

      UML图:

      

      模型类:

      

    Component类:
    package com.cnblog.clarck;
    
    /**
     * 接口对象,可以动态的给对象添加职责
     * 
     * @author clarck
     * 
     */
    public abstract class Component {
        public abstract void Operation();
    }
    ConcreateComponent类:
    package com.cnblog.clarck;
    
    /**
     * 具体的装饰对象,起到给Component添加职责
     * 
     * @author clarck
     * 
     */
    public class ConcreateComponent extends Component {
    
        @Override
        public void Operation() {
            System.out.println("具体对象的操作");
        }
    
    }
    Decorator类:
    package com.cnblog.clarck;
    
    /**
     * 装饰抽象类,继承了Component,从外来类来扩展Component类的功能,
     * 但对于Component来说是不需要知道Decorator的存在的。
     * 
     * @author clarck
     * 
     */
    public abstract class Decorator extends Component {
        protected Component mComponent;
    
        public void setComponent(Component component) {
            mComponent = component;
        }
        
        @Override
        public void Operation() {
            if (mComponent != null) {
                mComponent.Operation();
            }
        }
    
    }

    ConcreateDecoratorA类:
    package com.cnblog.clarck;
    
    /**
     * 具体的的装饰对象,起到给Component添加职责的作用
     * 
     * @author clarck
     * 
     */
    public class ConcreateDecoratorA extends Decorator {
        private String addedState;
    
        @Override
        public void Operation() {
            super.Operation();
            addedState = "New State";
            System.out.println("具体装饰对象A的操作" + addedState);
        }
    
    }
    ConcreateDecoratorB类:
    package com.cnblog.clarck;
    
    /**
     * 具体的装饰类B
     * 
     * @author clarck
     * 
     */
    public class ConcreateDecoratorB extends Decorator {
    
        @Override
        public void Operation() {
            super.Operation();
            addedBehaivor();
            System.out.println("具体装饰对象B");
        }
    
        private void addedBehaivor() { //用来区别ConcreateDecoratorA
            
        }
    }
    测试类:
    package com.cnblog.clarck;
    
    /**
     * 测试类
     * 
     * @author clarck
     * 
     */
    public class Test {
        public static void main(String[] args) {
            ConcreateComponent component = new ConcreateComponent();
            ConcreateDecoratorA decoratorA = new ConcreateDecoratorA();
            ConcreateDecoratorB decoratorB = new ConcreateDecoratorB();
    
            decoratorA.setComponent(component);
            decoratorB.setComponent(decoratorA);
            decoratorB.Operation();
        }
    }
  • 相关阅读:
    AJAX实现文件下载
    正则表达式收集
    C# Winform使用线程改变窗体控件的属性
    C# DataTable转List<Model>通用类
    C# ExcelHelper
    CSS浏览器兼容
    asp.net mvc Razor视图引擎
    『C程序设计』读书笔记系列文章之第八章 预编译处理
    .NET发邮件错误之"Could not access 'CDO.Message' object."
    英语词组日常积累
  • 原文地址:https://www.cnblogs.com/tanlon/p/3385283.html
Copyright © 2020-2023  润新知