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

    装饰模式-动态的给对象加入新功能。

    装饰:所谓锦上添花,装饰就是给加上“花”而它的核心本质还是“锦”。
    那么难免就有一个疑问那就直接加花就能够了啊,为什么要弄一个装饰模式出来呢?
    举个样例:一个家伙要和面,准备蒸个馒头吃吃。然后准备一些面,加水,呀。水多了,加面…无穷尽也~
    我们把装饰单独拿出来实现主体和附加功能的分离,在不使主体变得臃肿的情况下加入须要的新功能。再拿蒸馒头举例,蒸馒头吃的是面,那面就是主体。以这个面为核心,我们加点配料或者加个陷,或者弄几个花纹美化一下。假设不把装饰拿出来是什么样的呢:

    class ManTou{
        addMian();
    }
    class addHuaWen extends ManTou{
        addMian();
        ---------
        addHuawen();
    }
    class addRouXian extends ManTou{
        addMian();
        ----------
        addRouXian();
    }

    这样我们就重复使用主体。进入加面加水的循环,尽管达到了我们要加配料的目的,可是主体被滥用了,你可能仅仅想做两个馒头,最后蒸了一锅。
    看看装饰模式。馒头还是那个馒头。没有引发血案,仅仅是个馒头

    class ManTou{
        addMian();
    }
    class decorator extends ManTou{
        protected ManTou manTOu;
        makeManTou(ManTou manTou) {
            this.manTou = mantou;
        }
        @Override
        addMian();
    }
    
    class addHuawen extends decorator{
        @Override
        addMian(){
            super.addMian();
            addHuawen();
    }
    
    class addRouXian extends decorator{
        @Override
        addMian() {
            super.addMian();
            addRouXian();
    }

    体现装饰模式的优势就在client的代码了:

    static void main(String[] args) {
        ManTou m = new ManTou();
        addHuaWen h = new addHuaWen();
        addRouXian r = new addRouXian();
    
        h.makeManTou(m);
        r.makeManTou(h);
        r.addMian(); 

    通过client的实现能够发现就像穿衣服一样,一层套一层的加上去了我们的新需求,当你再想加个颜色,仅仅要再写一个addColor()就可以。client改动一下就可以,不须要去动addMian()这个主体。符合了开放和封闭原则。
    Uh… 最后想想做馒头这个样例举得不太好可能不利于理解,只是没想到更好的呢,想到再写~

  • 相关阅读:
    【LeetCode & 剑指offer刷题】字符串题8:Implement strStr()
    【LeetCode & 剑指offer刷题】字符串题7:String to Integer (atoi)
    项目-常用文档类型
    eclipse中一个项目引用另一个项目,运行报:java.lang.NoClassDefFoundError
    eclipse下的,maven+spring+springMVC+mabatis+mysql.创建
    eclipse +maven+ssm搭建矿建
    Android 自定义Adapter 但listview 只显示第一条数据
    树-二叉循环树
    对象排序,compareTo
    线性表-双向链表(LinkedList)
  • 原文地址:https://www.cnblogs.com/llguanli/p/7351136.html
Copyright © 2011-2022 走看看