关于java:设计模式8-手工耿教我写装饰器模式

54次阅读

共计 2402 个字符,预计需要花费 7 分钟才能阅读完成。

装璜器模式

后面学习了好几种设计模式,明天持续 …

装璜器模式,属于结构型模式,用来包裹封装当初的类对象,心愿能够在不批改当初类对象和类定义的前提下,可能拓展对象的性能。

调用的时候,应用的是装璜后的对象,而不是原对象。,提供了额定的性能。

不晓得大家有没有看手工耿的自制钢琴烤串车视频【https://www.bilibili.com/vide…】,原本是一个钢琴,然而为了边弹琴,边烤串,革新装璜了一下,变成了非凡的钢琴,提供了额定的烤串性能。典型的装璜器模式

目标: 为了灵便的拓展类对象的性能。

次要包含以下几种角色:

  • 形象组件(Component): 被装璜的原始类的形象,能够是抽象类,亦或是接口。
  • 具体实现类(ConcreteComponent): 具体的被形象的类
  • 形象装璜器(Decorator): 通用形象器
  • 具体装璜器(ConcreteDecorator):Decorator 的具体实现类,实践上,每个 ConcreteDecorator都扩大了 Component 对象的一种性能。

优缺点

长处:

  • 绝对于类继承,包裹对象更加容易拓展,更加灵便
  • 装璜类和被装璜类互相独立,耦合度比拟低
  • 齐全恪守开闭准则。

毛病:

  • 包裹对象层级较深的时候,了解难度较大。

实现

先抽闲一个乐器接口类 Instrument

public interface Instrument {void play();
}

弄两种乐器 PianoGuitar,实现乐器接口:

public class Piano implements Instrument{
    @Override
    public void play() {System.out.println("手工耿弹奏钢琴");
    }
}
public class Guitar implements Instrument{
    @Override
    public void play() {System.out.println("手工耿弹吉他");
    }
}

不论手工耿要边弹吉他边烧烤,还是边弹钢琴边烧烤,还是边弹钢琴边洗澡,不论什么需要,咱们形象一个装璜器类,专门对乐器类进行包装,装璜。

public class InstrumentDecorator implements Instrument{
    protected Instrument instrument;

    public InstrumentDecorator(Instrument instrument) {this.instrument = instrument;}

    @Override
    public void play() {instrument.play();
    }
}

下面的是形象的装璜类,具体装璜成什么样,咱们得搞点理论动作,那就搞个烧烤性能。

public class BarbecueInstrumentDecorator extends InstrumentDecorator {public BarbecueInstrumentDecorator(Instrument instrument) {super(instrument);
    }

    @Override
    public void play() {instrument.play();
        barbecue();}

    public void barbecue(){System.out.println("手工耿在烧烤");
    }
}

测试一下:

public class DecoratorDemo {public static void main(String[] args) {Instrument instrument = new Piano();
        instrument.play();
        System.out.println("----------------------------------------");
        InstrumentDecorator barbecuePiano = new BarbecueInstrumentDecorator(new Piano());
        barbecuePiano.play();
        System.out.println("----------------------------------------");
        InstrumentDecorator barbecueGuitar = new BarbecueInstrumentDecorator(new Guitar());
        barbecueGuitar.play();}
}

测试后果如下, 能够看到不装璜的时候,只能干一件事,装璜之后的对象,既能够弹奏乐器,也能够烧烤,不禁感叹:原来手工耿是设计模式高手:

手工耿弹奏钢琴
----------------------------------------
手工耿弹奏钢琴
手工耿在烧烤
----------------------------------------
手工耿弹吉他
手工耿在烧烤

小结一下

设计模式,不是银弹,只是在软件工程或者说编程中,演变进去的较好实际。咱们不能为了设计模式而设计模式,学习实践只是为了更好的应用它,晓得什么时候应该应用,什么时候不该应用。

装璜器模式是为了拓展其性能,但又不毁坏原来的构造的前提下做的,其实在 Java IO 的源码外面有大量应用,比方:

DataInputStream dis = new DataInputStream(
                    new BufferedInputStream(new FileInputStream("test.txt")
                            )
                    );

先把 FileInputStream 传递给 BufferedInputStream 弄成一个装璜对象,再把装璜对象传递给DataInputStream, 再装璜一遍。最终,FileInputStream 被包装成了 DataInputStream,感兴趣的同学能够翻一下源码。

【作者简介】
秦怀,公众号【秦怀杂货店】作者,技术之路不在一时,山高水长,纵使迟缓,驰而不息。

剑指 Offer 全副题解 PDF

开源编程笔记

正文完
 0