模板方法模式
优点:
- 提高代码复用性
将相同部分的代码放在抽象的父类中 - 提高了拓展性
将不同的代码放入不同的子类中,通过对子类的扩展增加新的行为 - 实现了反向控制
通过一个父类调用其子类的操作,通过对子类的扩展增加新的行为,实现了反向控制 & 符合“开闭原则”
缺点:
每个不同的实现都需要定义一个子类,这会导致类的个数增加,系统更加庞大,设计也更加抽象,但是更加符合“单一职责原则”,使得类的内聚性得以提高。
使用场景:
1、多个子类有公共的方法,并且逻辑基本相同
2、重要、复杂的算法,可以把核心算法设计模板方法,周边的相关细节功能则有各个子类实现。
Abstract Class(抽象模板类) | 定义一个或多个操作,操作可自身实现或在派生的子类中重载实现 |
Concrete Class(具体模板类) | 实现抽象模板角色中的抽象方法 |
例如:去商店买东西这个行为有共同的逻辑,但是细节不同,一个商店买橘子用微信,去另一个店买苹果用支付宝。
//Abstract Class(抽象模板类)
public abstract class BuySomething
{
public void GetSomething()
{
SelectSomething();
PayMoney();
GoOut();
}
public abstract void SelectSomething();
public abstract void PayMoney();
void GoOut()
{
Debug.Log("拿着东西走人");
}
}
//Concrete Class(具体模板类)
public class BuyOrange:BuySomething
{
public override void SelectSomething()
{
Debug.Log("买橘子");
}
public override void PayMoney()
{
Debug.Log("用微信付钱");
}
}
//Concrete Class(具体模板类)
public class BuyApple:BuySomething
{
public override void SelectSomething()
{
Debug.Log("买苹果");
}
public override void PayMoney()
{
Debug.Log("用支付宝");
}
}
public class Client: MonoBehaviour {
// Use this for initialization
void Start () {
BuyOrange tempBuyOrange = new BuyOrange();
tempBuyOrange.GetSomething();
BuyApple tempBuyApple = new BuyApple();
tempBuyApple.GetSomething();
}
}