java设计原则
1.开放-封闭原则
1.1 定义
对拓展开放,对修改关闭:比如当某个业务增加,不是在原类增加方法,而是增加原类的实现类
1.2 UML类图
1.3 设计背景
以银行业务为例:
/**
* @author tbb
* 银行业务类
*/
public class BankingBusiness
{
public void bankSavings()
{
System.out.println("存款");
}
public void drawMoney ()
{
System.out.println("取款");
}
public void transferAccounts()
{
System.out.println("转账");
}
}
/**
* @author tbb
* 客户类
*/
public class Client
{
/**
* 行为类型
*/
private String actionType;
public String getActionType() {
return actionType;
}
public void setActionType(String actionType) {
this.actionType = actionType;
}
public Client(String actionType) {
super();
this.actionType = actionType;
}
}
public class Test
{
public static void main(String[] args)
{
Client client = new Client("存款");//客户想去银行存款
BankingBusiness bankingBusiness = new BankingBusiness();
switch (client.getActionType())
{
case "存款" :bankingBusiness.bankSavings(); break;
case "取款" :bankingBusiness.drawMoney();; break;
case "转账" :bankingBusiness.transferAccounts();; break;
default:break;
}
}
}
这设计显然是存在问题的,目前设计中就只有存款,取款和转账三个功能,将来如果业务增加了,比如增加理财功能等,就必须要修改BankProcess业务类。我们分析上述设计当有新的需求发生,必须修改现有代码则违反了开放封闭原则
1.4 实现思路
为达到目的,需对系统进行抽象化设计:象上述存款、取款、转账、理财等行为,可以抽象为银行业务行为。
1.5 实现场景
/**
* @author tbb
* 银行业务接口类
*/
public interface BankingBusiness
{
public void business();//业务
}
/**
* @author tbb
* 存款业务类
*/
public class BankSavings implements BankingBusiness
{
@Override
public void business()
{
System.out.println("存款");
}
}
/**
* @author tbb
* 取款业务类
*/
public class DrawMoney implements BankingBusiness
{
@Override
public void business()
{
System.out.println("取款");
}
}
/**
* @author tbb
* 转账业务类
*/
public class TransferAccounts implements BankingBusiness
{
@Override
public void business()
{
System.out.println("转账");
}
}
/**
* @author tbb
* 理财业务类
*/
public class ManageMoneyMatters implements BankingBusiness
{
@Override
public void business()
{
System.out.println("理财");
}
}
/**
* @author tbb
* 客户类
*/
public class Client
{
/**
* 行为类型
*/
private String actionType;
public String getActionType() {
return actionType;
}
public void setActionType(String actionType) {
this.actionType = actionType;
}
public Client(String actionType) {
super();
this.actionType = actionType;
}
}
public class Test
{
public static void main(String[] args)
{
Client client = new Client("理财");
BankSavings bankSavings = new BankSavings();
ManageMoneyMatters manageMoneyMatters = new ManageMoneyMatters();
TransferAccounts transferAccounts = new TransferAccounts();
DrawMoney drawMoney = new DrawMoney();
switch (client.getActionType())
{
case "存款" :bankSavings.business(); break;
case "取款" :drawMoney.business(); break;
case "转账" :transferAccounts.business(); break;
case "理财" :manageMoneyMatters.business(); break;
default:break;
}
}
}