设计模式——装饰模式详解
0. 前言 ?
寫在最前面,本人的設計模式類博文,建議先看博文前半部分的理論介紹,再看后半部分的實例分析,最后再返回來復習一遍理論介紹,這時候你就會發現我在重點處標紅的用心,對于幫助你理解設計模式有奇效哦~本文原創,轉載請注明出處為SEU_Calvin的博客。
裝飾模式是結構型設計模式之一,使用一種對客戶透明的方式來動態拓展對象的功能,Java IO中各種流的嵌套就是裝飾模式的很好體現。
?
1. 裝飾模式介紹
裝飾模式定義:
動態地給一個對象添加一些額外的功能,比生成子類要靈活。
?
裝飾模式的使用場景:
需要透明且動態地拓展類的功能的場景。
?
裝飾模式包括的角色:
?
(1)抽象組件Component類。
(2)組件具體實現ConcreteComponent類。也是被裝飾的對象。
(3)抽象裝飾類Decorator,內部持有一個組件對象的引用,職責就是裝飾ConcreteComponent類。之所以是抽象的,就是為了方便不同的裝飾“風格”子類的自定義實現。
(4)具體裝飾類ConcreteDecorator。
?
2. ?裝飾模式實例介紹
想到裝飾,很容易想到一個人穿衣服,在不同的季節穿不同的衣服,比如夏天穿短褲、冬天穿毛褲,但是不管什么季節,內褲肯定是要穿的。
抽象組件Component類就可以是抽象類Person,而ConcreteComponent類就可以是具體的一個人Calvin,也是要被裝飾的對象。抽象裝飾類Decorator持有了Calvin的引用,并且回調了Calvin本身的一個“穿內褲”的行為,并且在具體的裝飾類中,即“冬夏”兩個類中,分別為主人公Calvin穿上了毛褲和短褲,為對象增加了額外的功能。代碼也比較簡單,如下所示。
/*** Decorator Pattern* Created by Calvin on 2017/5/10.*/ public class Decorator {public static void main(String[] args) {Person calvin = new Calvin();PersonCloth summerCloth = new SummerCloth(calvin);PersonCloth winterCloth = new WinterCloth(calvin);summerCloth.dressed();winterCloth.dressed();}public static abstract class Person{public abstract void dressed();}public static class Calvin extends Person{@Overridepublic void dressed() {System.out.println("穿件內褲");}}public static abstract class PersonCloth extends Person{Person myPerson;public PersonCloth(Person myPerson) {this.myPerson = myPerson;}@Overridepublic void dressed() {myPerson.dressed();}}public static class SummerCloth extends PersonCloth{public SummerCloth(Person myPerson) {super(myPerson);}@Overridepublic void dressed() {super.dressed();System.out.println("穿件短褲");}}public static class WinterCloth extends PersonCloth{public WinterCloth(Person myPerson) {super(myPerson);}@Overridepublic void dressed() {super.dressed();System.out.println("穿件毛褲");}} }3.? 裝飾模式總結
裝飾模式動態地給一個對象添加一些額外的功能,相對于繼承的方式,更加靈活。
裝飾模式經常被誤認為是代理模式。裝飾模式是以對客戶透明的方式擴展對象的功能,是繼承關系的一個替代方案。而代理模式則是給一個對象提供一個代理對象,并由代理對象來控制原有對象的引用。
前者重在增加功能,后者重在對代理對象施加控制,不是對對象本身功能的增強。
總結
以上是生活随笔為你收集整理的设计模式——装饰模式详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LIS系统源码 实验室信息管理系统源码
- 下一篇: 区块链将怎样影响游戏行业