1。分清楚:通用点(要封装起来可重用)、扩展点(变化点)
2。有白盒框架、黑盒框架、灰盒框架。
作用都是要把扩展点插入通用点中。
~白盒框架:主要用继承法:钩子方法、模版方法
钩子方法:
定义:
public abstract class BasicBusiness
{
protected float income;
public void ReportTax()
{
float sTax=CalculateStateTax();
float fTax=CalculateStateTax();
bool ok=checkBankBalance(sTax+fTax);
if (!ok)
{
FlieBankruptcy();
}
esle
{
SendMoneyToGov(sTax+fTax);
}
}
protected abstract float CalculateStateTax();
protected abstract float CalculateFedTax();
}
//定义了通用点
public class NewYorkBusiness:BasicBusiness
{
protected override float CalculateStateTax()
{
return income*0.1F;
}
protected override float CalculateFedTax()
{
return income*0.2F;
}
}
//定义了扩展点
BasicBusiness nyBusiness=new NewYorkBusiness();
nyBusiness.ReportTax();
BasicBusiness caBusiness=new CaliforniaBusiness();
caBusiness.ReportTax();
其中ReporTax()就是模板。
public abstract class BasicBusiness
{
protected float income;
public void ReportTax()
{
float sTax=CalculateStateTax();
float fTax=CalculateStateTax();
bool ok=checkBankBalance(sTax+fTax);
if (!ok)
{
FlieBankruptcy();
}
esle
{
SendMoneyToGov(sTax+fTax);
}
}
protected abstract float CalculateStateTax();
protected abstract float CalculateFedTax();
}
public interface ICalculateTax
{
float CalculateStateTax();
float CalculateFedTax();
float Income
{
get ;set;
}
}
//多加了这个接口,就不可以知道通用类里面的数据和参数了。。。
public class NewYorkBusiness:ICalculateTax
{
private float income;
public float Income
{
get{ return income;}
set{ income=value;}
}
public float CalculateStateTax()
{
return income*0.1F;
}
public float CalcuateFedTax()
{
return income*0.2F;
}
}
~组合法
public class BasicBusiness
{
public void ReporTax(ICalculateTax calculator)
{
float sTax=calculator.CalculateStateTax();
float fTax=calculator.CalculateFedTax();
bool ok=CheckBalance(sTax+fTax);
if (!ok)
{
FileBankruptcy();
}
else
{
SendMoneyToGov(sTax+fTax);
}
}
}
ICalculateTax nyBusiness=new NewYorkBusiness();
ICalculateTax caBusiness=new CaliforniaBusiness();
BasicBusiness basic=new BasicBusiness();
basic.ReportTax(nyBusiness);
basic.ReportTax(caBusiness);
2。有白盒框架、黑盒框架、灰盒框架。
作用都是要把扩展点插入通用点中。
~白盒框架:主要用继承法:钩子方法、模版方法
钩子方法:
定义:
public abstract class BasicBusiness
{
protected float income;
public void ReportTax()
{
float sTax=CalculateStateTax();
float fTax=CalculateStateTax();
bool ok=checkBankBalance(sTax+fTax);
if (!ok)
{
FlieBankruptcy();
}
esle
{
SendMoneyToGov(sTax+fTax);
}
}
protected abstract float CalculateStateTax();
protected abstract float CalculateFedTax();
}
//定义了通用点
public class NewYorkBusiness:BasicBusiness
{
protected override float CalculateStateTax()
{
return income*0.1F;
}
protected override float CalculateFedTax()
{
return income*0.2F;
}
}
//定义了扩展点
BasicBusiness nyBusiness=new NewYorkBusiness();
nyBusiness.ReportTax();
BasicBusiness caBusiness=new CaliforniaBusiness();
caBusiness.ReportTax();
其中ReporTax()就是模板。
public abstract class BasicBusiness
{
protected float income;
public void ReportTax()
{
float sTax=CalculateStateTax();
float fTax=CalculateStateTax();
bool ok=checkBankBalance(sTax+fTax);
if (!ok)
{
FlieBankruptcy();
}
esle
{
SendMoneyToGov(sTax+fTax);
}
}
protected abstract float CalculateStateTax();
protected abstract float CalculateFedTax();
}
public interface ICalculateTax
{
float CalculateStateTax();
float CalculateFedTax();
float Income
{
get ;set;
}
}
//多加了这个接口,就不可以知道通用类里面的数据和参数了。。。
public class NewYorkBusiness:ICalculateTax
{
private float income;
public float Income
{
get{ return income;}
set{ income=value;}
}
public float CalculateStateTax()
{
return income*0.1F;
}
public float CalcuateFedTax()
{
return income*0.2F;
}
}
~组合法
public class BasicBusiness
{
public void ReporTax(ICalculateTax calculator)
{
float sTax=calculator.CalculateStateTax();
float fTax=calculator.CalculateFedTax();
bool ok=CheckBalance(sTax+fTax);
if (!ok)
{
FileBankruptcy();
}
else
{
SendMoneyToGov(sTax+fTax);
}
}
}
ICalculateTax nyBusiness=new NewYorkBusiness();
ICalculateTax caBusiness=new CaliforniaBusiness();
BasicBusiness basic=new BasicBusiness();
basic.ReportTax(nyBusiness);
basic.ReportTax(caBusiness);