zoukankan      html  css  js  c++  java
  • 设计模式开始--装饰模式

    装饰模式

    一、作用:

    为已有的功能添加新的功能的设计模式,当系统需要新的功能时候,要在原有的基础上增加一点新的功能的时候,也就是装饰一点功能的时候,不需要再原有的代码上进行修改。

    装饰的功能就是把核心职责和核心功能划分开了。

    对比生成器模式:

    (1)生成器模式类执行是有顺序的

    (2)装饰模式执行顺序是没有顺序的,是随机的,想怎么装饰就怎么装饰,装饰的是一些无关紧要的事情,核心的代码还是之前的类在做

    二、类图

    解释一下:

    左边两个实现类(ConsoleLogger FileLogger)是核心的实现类,主要的功能都是由这两个实现的

    右边两个实现类(UpLogger,XMLLogger)是装饰类,只是加了一些装饰的属性,核心的功能还是左边的那两个类

    三、实现

    1、定义方法的接口

    public interface ICook {
        public void cook();
    }
    View Code

    2、两个核心实现类

    public class Cabbage implements ICook {
        @Override
        public void cook() {
            // TODO Auto-generated method stub
            System.out.println("cook cabbage");
        }
    }
    public class Vegetable implements ICook {
        @Override
        public void cook() {
            // TODO Auto-generated method stub
            System.out.println("cook vegetable");
        }
    }
    View Code

    3、定义Decorator的方式 抽象类

    public abstract class Decorator implements ICook {
        protected ICook cook;
        public Decorator(ICook cook)
        {
            this.cook = cook;
        }
    }
    View Code

    4、两个实现装饰功能的 实现类

    public class PepperDecorator extends Decorator {
        public PepperDecorator(ICook cook) {
            super(cook);
        }
        @Override
        public void cook() {
            addPepper();
            cook.cook();
        }
        public void addPepper()
        {
            System.out.println("add some pepper");
        }
    }
    public class SugarDecorator extends Decorator {
    
        public SugarDecorator(ICook cook) {
            super(cook);
        }
        @Override
        public void cook() {
            addSugar();
            cook.cook();
        }
        public void addSugar()
        {
            System.out.println("add some sugar");
        }
    }
    View Code

    5、测试类

    public class Client {
    
        public static void main(String[] args) {
            Client client = new Client();
            ICook cook = new Cabbage();
            ICook pepper = new PepperDecorator(cook);
            pepper.cook();
        }
    }
    View Code
  • 相关阅读:
    android中的一个圆角图片
    android中一个评分的控件
    C++ primer(第五版)中需要复习第二遍的知识点记录
    在ubuntu18.04上交叉编译opencv2.4.9
    C6748和音频ADC连接时候的TDM以及I2S格式问题
    C6748的启动方式问题
    AK5703的ALC
    cool edit工具介绍及使用
    CCS编译环境及TI仿真器的使用
    把YUV转化成opencv中的Mat格式的两行代码备份
  • 原文地址:https://www.cnblogs.com/sunshisonghit/p/4376503.html
Copyright © 2011-2022 走看看