結(jié)合項目實例 回顧傳統(tǒng)設(shè)計模式(一)策略模式
2011-09-09 10:21 熬夜的蟲子 閱讀(1234) 評論(1) 收藏 舉報蟲子以前在一家電商公司 會員的模塊在這里分類很明確
不同的會員所具有的權(quán)限和行為不同,大多程序員會使用標(biāo)準(zhǔn)的oo技術(shù),設(shè)計一個會員超類SuperUser,并讓各種商家會員繼承此超類
到這里無可厚非,但是在下面?zhèn)€過程中你可以就慢慢體會策略模式與你在代碼里不停寫邏輯判斷所帶來的區(qū)別有多大
所有的會員都具有下列行為
購物,評價,發(fā)布商品
View Code
public abstract class SuperUser
{
public SuperUser()
{
}
public void shopping()
{
Console.WriteLine("shopping");
}
public void Comment()
{
Console.WriteLine("Comment");
}
public abstract void Promote();
}
public class UserA : SuperUser
{
public override void Promote()
{
Console.WriteLine("推廣A類商品");
}
}
public class UserB : SuperUser
{
public override void Promote()
{
Console.WriteLine("推廣B類商品");
}
}
{
public SuperUser()
{
}
public void shopping()
{
Console.WriteLine("shopping");
}
public void Comment()
{
Console.WriteLine("Comment");
}
public abstract void Promote();
}
public class UserA : SuperUser
{
public override void Promote()
{
Console.WriteLine("推廣A類商品");
}
}
public class UserB : SuperUser
{
public override void Promote()
{
Console.WriteLine("推廣B類商品");
}
}
因為不同商家會員只能推廣指定類型的商品所以這里Promote方法抽象出來
好吧 現(xiàn)在我們來了一個新需求 對于B類的用戶 進行購物折價
加在什么地方 超類? 不 并不是所有的會員都擁有折價 邏輯判斷? 是個方法 不過對于不斷需求的變更 在龐大臃腫的領(lǐng)域模型中 時間長了 也hold不住 更何況還不停有不同的商家會員分類加進來 并且在大型web架構(gòu)中作為基站的程序不適合頻繁更新
既然這樣 利用接口如何 對改變關(guān)閉 對擴展開放
View Code
public interface discountBehavior
{
void discount();
}
public class diswithB : discountBehavior
{
public void discount()
{
Console.WriteLine("能打折扣呃");
}
}
public class Nodis : discountBehavior
{
public void discount()
{
Console.WriteLine("不能打折扣");
}
}
public abstract class SuperUser
{
public SuperUser()
{
}
public void shopping()
{
Console.WriteLine("shopping");
}
public void Comment()
{
Console.WriteLine("Comment");
}
public abstract void Promote();
public discountBehavior dcbehavior;
public void discount()
{
dcbehavior.discount();
}
}
public class UserA : SuperUser, discountBehavior
{
public UserA()
{
dcbehavior = new Nodis();
}
public override void Promote()
{
Console.WriteLine("推廣A類商品");
}
}
public class UserB : SuperUser, discountBehavior
{
public UserB()
{
dcbehavior = new diswithB();
}
public override void Promote()
{
Console.WriteLine("推廣B類商品");
}
}
{
void discount();
}
public class diswithB : discountBehavior
{
public void discount()
{
Console.WriteLine("能打折扣呃");
}
}
public class Nodis : discountBehavior
{
public void discount()
{
Console.WriteLine("不能打折扣");
}
}
public abstract class SuperUser
{
public SuperUser()
{
}
public void shopping()
{
Console.WriteLine("shopping");
}
public void Comment()
{
Console.WriteLine("Comment");
}
public abstract void Promote();
public discountBehavior dcbehavior;
public void discount()
{
dcbehavior.discount();
}
}
public class UserA : SuperUser, discountBehavior
{
public UserA()
{
dcbehavior = new Nodis();
}
public override void Promote()
{
Console.WriteLine("推廣A類商品");
}
}
public class UserB : SuperUser, discountBehavior
{
public UserB()
{
dcbehavior = new diswithB();
}
public override void Promote()
{
Console.WriteLine("推廣B類商品");
}
}
下面我們再來試試動態(tài)設(shè)定行為
在超類中加個方法
View Code
public void setdiscountBehavior(discountBehavior dh)
{
dcbehavior = dh;
}
{
dcbehavior = dh;
}
這樣就可以“隨時”調(diào)用這個方法 改變會員的行為
總結(jié):
策略模式:針對接口編程,而不是針對實現(xiàn)編程。多用組合少用繼承。策略模式定義了算法簇,分別封裝起來,讓它們之間可以互相替換,此模式讓算法的變化獨立于使用算法的客戶。
![]() |
原創(chuàng)作品允許轉(zhuǎn)載,轉(zhuǎn)載時請務(wù)必以超鏈接形式標(biāo)明文章原始出處以及作者信息。 作者:熬夜的蟲子 點擊查看:博文索引 |


浙公網(wǎng)安備 33010602011771號