中科院云平台架构师,专注于数字化、智能化,技术方向:云、Linux内核、AI、MES/ERP/CRM/OA、物联网、传感器、大数据、ML、微服务。
分类: Java
2013-12-27 16:35:26
S:(Single Responsible Principle)一个对象只实现一个功能。
O:类可以扩展但不能修改。
L:子类型应该能够替换它们的基类型。
即子类中重写方法时使用的类型必须是父类的类型或子类型。
举例:
抽象方法 Public abstract deposit(int amt) throws AmountException
子类实现时:Public void deposit(int amt) throws InvalidAmountException -> OK
Public void deposit(int amt) throws AmountException -> OK
Public void deposit(int amt) throws Exception -> NG
I:众多的接口要优于单一的、通用型的接口。
接口实现单一功能。要实现多功能时可以实现多个接口。不要试图做一个大而全的接口。
D:依赖于抽象体而不是一个具体实现类。是该原则的一种实现方式。
可以抽象耦合,不要实例耦合。 --> 低耦合原则
类不应该耦合于另一个具体的类或者可以实例化的类。应该耦合于其他的基类或抽象类。
Class c = Class.forName(“具体类名”);
父接口 = (父接口)c.newInstance();
package atest.solid.OpenClosedPrinciple;
public class OCPTest {
/**
* [メソッドの説明を書きましょう]
* @param args
*/
public static void main(String[] args) {
// TODO 自動生成されたメソッド?スタブ
int amt = 300;
AccountType saves = new SavingsAccount();
saves.deposit(amt);
AccountType check = new CheckingAccount();
check.deposit(amt);
}
}
package atest.solid.OpenClosedPrinciple;
public class Account {
private AccountType _act;
public Account(String act){
try{
Class c = Class.forName(act);
this._act = (AccountType)c.newInstance();
} catch (Exception e){
e.printStackTrace();
}
}
public void deposit(int amt){
this._act.deposit(amt);
}
}
package atest.solid.OpenClosedPrinciple;
public interface AccountType {
public void deposit(int amt);
}
package atest.solid.OpenClosedPrinciple;
public class SavingsAccount implements AccountType {
@Override
public void deposit(int amt) {
// TODO 自動生成されたメソッド?スタブ
System.out.println("Amount deposited in " + "savings acount(\\):" + amt);
}
}
package atest.solid.OpenClosedPrinciple;
public class CheckingAccount implements AccountType {
@Override
public void deposit(int amt) {
// TODO 自動生成されたメソッド?スタブ
System.out.println("Amount deposited in " + "checkings acount(\\):" + amt);
}
}
执行结果:
Amount deposited in savings acount(\):300
Amount deposited in checkings acount(\):300
测试类稍微改动了一下:
package atest.solid.OpenClosedPrinciple;
public class OCPTest {
/**
* [メソッドの説明を書きましょう]
* @param args
*/
public static void main(String[] args) {
// TODO 自動生成されたメソッド?スタブ
int amt = 300;
int amt2 = 400;
AccountType saves = new SavingsAccount();
saves.deposit(amt);
AccountType check = new CheckingAccount();
check.deposit(amt);
System.out.println("-----------------------------");
//应用上Account类
Account saves2 = new Account("atest.solid.OpenClosedPrinciple.SavingsAccount");
saves2.deposit(amt2);
Account check2 = new Account("atest.solid.OpenClosedPrinciple.CheckingAccount");
check2.deposit(amt2);
}
}
输出结果:
Amount deposited in savings acount(\):300
Amount deposited in checkings acount(\):300
-----------------------------
Amount deposited in savings acount(\):400
Amount deposited in checkings acount(\):400