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… 最后想想做馒头这个样例举得不太好可能不利于理解,只是没想到更好的呢,想到再写~

  • 相关阅读:
    java.lang.NoSuchMethodError:antlr.collections.AST.getLine() I
    T7 java Web day01 标签HTML
    T6 s1 day19
    T5 s5 Day18
    T5 s4 Day 17
    T5 s3 day16
    T5 s2 Day 15
    T5 s1 day14
    T4 S03 day 12
    T4 S01 day1
  • 原文地址:https://www.cnblogs.com/llguanli/p/7351136.html
Copyright © 2011-2022 走看看