一直都想擁有一個屬於自己的技術博客,今天終於開通了,很激動。第一篇隨筆就分享一下自己今天剛學習和實踐的裝飾者設計模式。 一、設計模式到底是什麼東西,它有對應的物質嗎? 如果我們看不到物質,那麼一切的意識都是站不住腳的。那麼什麼是設計模式呢?它能映射到對應的物質嗎? 以前我剛開始接觸設計模式是在學習j ...
一直都想擁有一個屬於自己的技術博客,今天終於開通了,很激動。第一篇隨筆就分享一下自己今天剛學習和實踐的裝飾者設計模式。
一、設計模式到底是什麼東西,它有對應的物質嗎?
如果我們看不到物質,那麼一切的意識都是站不住腳的。那麼什麼是設計模式呢?它能映射到對應的物質嗎?
以前我剛開始接觸設計模式是在學習java語言中的面向對象思想,那時候覺得很高大上,因為我看不到設計模式到底是什麼,它太神秘了,似乎在我的物質世界了從來沒有出現過。之所有會這樣子,我想一方面是因為“教者”沒有把它的物質給映射出來,另一方面是“學者”沒有正確的把握住物質與意識的關係。
設計模式它並沒有對應的物質,它映射到的是一種行為方法,而這個行為就是設計,所有說設計模式它講的就是該以怎麼樣的方式去設計一樣東西,從這樣的一個定義來看,其實設計模式對於我們來說其實並不陌生,它並不是只有在軟體開發行業才存在,它是只要涉及到具有創造性行為的行業都應該離不開的一種行為方法論。
等等,好像我們對設計模式進行物質映射的時候得到的還是意識“設計方法”,沒有看到物質,而是看到了一種行為--設計,對吧。但是,行為它不是憑空出現的,他肯定是需要主體(人)和客體(要設計的東西)的(至少需要主體)。現在有看到物質了吧,是不是看到了主體(人)再對(要設計的東西)進行設計這樣一個畫面。我們在進行設計的時候,我們不關註主體人怎麼樣了,而是更加關註客體“要設計的東西”設計成什麼樣了,對吧。其實我們要設計的東西是來自於身邊的某個特定的事物的,換句話說就是模仿某個具體的事物進行設計。這個模仿過程包括模仿具體事物的物理結構和邏輯結構,也就是事物的內在和外在聯繫。
由此可見,我們研究設計模式,其實本質上是對要模仿事物的內在和外在聯繫進行研究。
(一)裝飾模式是對具有哪些特點的事物進行模仿設計的一種設計行為方式呢?
如果我們所模仿設計的事物是隨著時間的發展其內部主體沒有發生改變的,但其外在樣式和附加功能是有所改變的一類事物(比如房子),那麼我們就應該選擇裝飾模式這種正確的設計行為方式。
(二)軟體程式設計(java語言)應如何體系這一設計方法呢?
1.我們來看看類圖吧:
(1).我們應該定義一個抽象的Component,作為抽象的被裝飾主體,可以是一個抽象的類,也可以是一個介面的,Component中定義一個用於以後拓展的方法。
(2).然後定義一個繼承/實現該抽象Component的具體ConcreteComponent組件,該組件對抽象組件進行基礎的裝飾。
(3).其次定義一個抽象的decorator,該類也是繼承於抽象組件(是為了得到和抽象組件相同類型的類,從而可以進行再次裝飾),定義一個和抽象組件相同的方法(實現客戶端調用的透明性)。
(4).最後定義我們的具體裝飾器,該類繼承於抽象decorator,我們在裡面定義一個抽象的component,定義一個參數持有抽象Component引用的構造方法,接著我們實現抽象decorator的抽象方法,通過回調註入的組件的基礎方法進而實現了對註入組件的裝飾和附加任務,同時我們也還可以在該類裡面定義新的方法對原有組件功能進行拓展。
2.下麵是具體的代碼(以模擬人穿衣服的場景進行設計):
(1).AbstractPerson.java(抽象component)
package decorator.goldIsAbstact; public abstract class AbstractPerson { public abstract void show(); }
(2)Man.java(具體Component:男人)
package decorator.goldIsAbstact; public class Man extends AbstractPerson{ @Override public void show() { System.out.println("I am a common man!"); System.out.println("man before decorate!"); } }
(3)Woman.java(具體Component:女人)
package decorator.goldIsAbstact; public class Woman extends AbstractPerson{ @Override public void show() { System.out.println("I am a common girl"); System.out.println("girl befor decorate!"); } }
(4)Clothing.java(抽象decorator:衣服)
package decorator.goldIsAbstact; public abstract class Clothing extends AbstractPerson { protected AbstractPerson abstractPerson; public Clothing(AbstractPerson abstractPerson) { super(); this.abstractPerson = abstractPerson; } public void show(){ abstractPerson.show(); } }
(5)Jeans.java(具體decorator:牛仔褲)
package decorator.goldIsAbstact; public class Jeans extends Clothing{ public Jeans(AbstractPerson abstractPerson) { super(abstractPerson); // TODO Auto-generated constructor stub } @Override public void show() { System.out.println("我是一條牛仔褲!給男人穿的!開始穿。。。。"); super.show(); System.out.println("穿好了,好看嗎?"); } public void jump(){ System.out.println("I can jump!"); } }
(6)Skirt.java(具體decorator:裙子)
package decorator.goldIsAbstact; public class Skirt extends Clothing{ public Skirt(AbstractPerson abstractPerson) { super(abstractPerson); // TODO Auto-generated constructor stub } public void show(){ System.out.println("我是一條裙子,我是給女人穿的!開始穿、、、、、"); super.show(); System.out.println("穿好了,漂亮嗎?"); } public void fly () { System.out.println("I can fly!"); } }
(7)Test.java(測試類)
package decorator.goldIsAbstact; public class Test { public static void main(String[] args) { Man weiHeng=new Man(); Woman luXi=new Woman(); weiHeng.show(); luXi.show(); Jeans jeans=new Jeans(weiHeng); jeans.show(); jeans.jump(); // Skirt skirt=new Skirt(luXi); // jeans.show(); // skirt.show(); // // System.out.println("llllllllllllllllllllllllllllllll男變女"); // skirt=new Skirt(weiHeng); // skirt.show(); // System.out.println("llllllllllllllllllllllllllllllll女變男"); // jeans=new Jeans(luXi); // jeans.show(); System.out.println("llllllllllllllllllllllllllllllll女男混合,牛仔裡面,裙子在外面"); Skirt skirt=new Skirt(jeans); skirt.fly(); skirt.show(); skirt.fly(); // System.out.println("llllllllllllllllllllllllllllllll女男混合,牛仔外面,裙子在裡面"); // skirt=new Skirt(luXi); // skirt.fly(); // jeans=new Jeans(skirt); // jeans.show(); // jeans.jump(); // // System.out.println("llllllllllllllllllllllllllllllll女男混合,牛仔外面,裙子在裡面,再穿一條牛仔"); // jeans=new Jeans(jeans); // jeans.show(); // jeans.jump(); } }
3.測試裝飾效果:
(三)總結:
以上是模擬人進行穿衣服場景進行了一個模擬設計,從中我們可以看到正確的方法論是多麼的重要,同時也體會到了裝飾設計模式之美!
下一遍繼續寫設計方法論中其他的模式。