當今市場上手機的種類多如牛毛,基本功能都是打電話和發短信,然後,如果是我們生產一款手機,怎樣才能讓我們的手機擁有自己的賣點,在手機市場上脫穎而出,贏得消費者的青睞呢?
我覺得非常重要的一點就是手機的附加功能,如果我們的手機有很多對用戶很實用的附屬功能,能夠從用戶的角度出發,讓擁有我們的手機的用戶隨心所欲,能通過我們的手機解決很多他們想要解決的問題,那麼,我覺得我們生產的這款手機一定會有它的賣點。比如視頻通話功能,讓我們的用戶在通話的同時看到對方,能手寫,可以滿足很多不會打字的五六十年代那長輩們的文字輸入,那樣的用戶體驗是不是非常好?
所以,我們應該從手機的附屬功能上,即手機裝飾上狠下功夫。鑑於此,我也思考了一番,爲手機設計了一些附屬功能。如下圖:
要實現以上手機的裝飾,我們先必須弄清楚什麼是裝飾模式。
我覺得裝飾模式就是給對象在已有功能的基礎上動態添加一些額外的功能的方式,比如我們設計的手機,一般手機都會最初就具備打電話,發短信的功能,否則的話就不叫手機;然而,這些基礎的功能還不是我們的目的,我們目的是要讓自己的手機有賣點,就必須添加一些吸引顧客的額外功能,如上圖中的遊戲,觸屏,照相等。然後我們怎樣將這些額外功能加到手機上去,將這些額外功能添加到手機的方式就是我們要用到的裝飾模式。
下面我們就再來分析分析裝飾模式,看看它的結構圖。
上圖中Component是定義一個對象接口,可以給對象動態地添加職責。ConcreteComponent是定義了一個具體的對象,也可以該這個對象添加職責。Decorator,是裝飾抽象類,繼承了Component,從外類來拓展Component類的功能,但對於Component來說,是無需知道Decorator的存在的。而ConcreteDecorator就是具體的裝飾對象,起到給Component添加職責的功能。
我們這裏是設計手機,根據上圖,還得搞清楚一個問題,就是我們這裏的"手機"類是Component還是ConcreteComponent?這就得注意了,如果只有一個ConcreteComponent類而沒有抽象的Component類,那麼Decorator類可以是ConcreteComponent的一個子類,同樣的道理,如果只有一個ConcreteDecorator類,那麼就沒有必要建立一個單獨的Decorator類,而可以把Decorator和ConcreteDecorator的責任合併成一個類。我們就可以利用這麼一點,下面我們來設計一下我們的代碼結構圖:
從上圖我們可以看到,最上面是一個手機實體,功能實體繼承了手機實體,具體的每一個裝飾功能又繼承了功能實體。而我們要實現的是不同個體的手機都可以拓展我們的每一個同能,也可以減去每一個同能,而且都可以在客戶端控制,這樣就已經非常明瞭了,思路非常清晰。
下面我們看看代碼實現:
先是實現"Mobile"類(ConcreteComponent)
public class Mobile
{
public Mobile()
{ }
private string type;
public Mobile(string type)
{
this.type = type;
}
public virtual void Show()
{
Console.WriteLine(" 添加的{0}",type);
}
}
拓展功能類:Decorator
public class Decorator:Mobile
{
protected Mobile component;
//拓展
public void expand(Mobile component)
{
this.component = component;
}
//輸出
public override void Show()
{
if (component != null)
{
component.Show();
}
}
}
具體拓展功能類:ConcreteDecorator
public class Game:Decorator
{
public override void Show()
{
Console.WriteLine("遊戲功能 ");
base.Show();
}
}
public class Touch : Decorator
{
public override void Show()
{
Console.WriteLine("觸屏功能 ");
base.Show();
}
}
曾祥瑚
2010.06.28 15:06
public class Photo : Decorator
{
public override void Show()
{
Console.WriteLine("照相功能 ");
base.Show();
}
}
public class Memory : Decorator
{
public override void Show()
{
Console.WriteLine("內存卡擴展功能 ");
base.Show();
}
}
public class MP3 : Decorator
{
public override void Show()
{
Console.WriteLine("MP3功能 ");
base.Show();
}
}
public class Recording : Decorator
{
public override void Show()
{
Console.WriteLine("錄音功能 ");
base.Show();
}
}