软件设计原则
目标:构建松散耦合的系统
1.开闭原则
一个软件,应该对扩展开放,对修改关闭应。当可以在不必修改源代码的情况下改变这个模块的行为,在保持系统一定稳定性的基础上,对系统进行扩展。
2.里氏代换原则
子类可以扩展父类的功能,但不能改变父类原有的功能。也就是说子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。子类中可以增加自己特有的方法。
3.依赖倒置原则
抽象不应当依赖于细节,细节应当依赖于抽象。也就是说应当依赖于接口,而不是依赖于实现。
4.接口隔离原则
一个类对另外一个类的依赖是建立在最小的接口上,接口中尽量少包含方法。假如接口中方法过多,应将其拆散为多个接口。
5.合成/聚集复用原则
使用合成/聚集来代替继承
6.迪米特法则
不要和陌生人讲话,也就是不可以在一个类中暴露与它自己不相干的类。
7.单一职责原则
就一个类而言,应该仅有一个引起它变化的原因,如果你能想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责.应该把多于的指责分离出去,分别再创建一些类来完成每一个职责。
常用设计模式
1.单例模式
单例模式是设计模式中使用最为普遍的模式之一。它是一种对象创建模式,用于产生一个对象的具体实例,它可以确保系统中一个类只产生一个实例。在Java语言中,这样的行为能带来两大好处:
(1)对于频繁使用的对象,可以省略new操作花费的时间,这对于那些重量级对象而言,是非常可观的一笔系统开销。
(2)由于new操作的次数减少,因而对系统内存的使用频率也会降低,这将减轻GC压力,缩短GC停顿时间。
public class Singleton {
private Singleton(){
System.out.println("Singleton is create");
}
private static Singleton instance = new Singleton();
public static Singleton getInstance() {
return instance;
}
}
2.代理模式
为其他对象提供一种代理,并以控制对这个对象的访问。(Provide asurrogate or placeholder foranother object tocontrol access to it. )而对一个对象进行访问控制的一个原因是为了只有在我们确实需要这个对象时才对它进行创建和初始化。
public interface IDBQuery {
String request();
}
public class DBQuery implements IDBQuery{
public DBQuery(){
try {
Thread.sleep(1000); //可能包含数据库连接等耗时操作
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public String request() {
return "request string";
}
}
3.工厂模式
工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的。
public class Factory {
public BMW createBMW(int type) {
switch (type) {
case 320:
return new BMW320();
case 523:
return new BMW523();
default:
break;
}
return null;
}
}
4.装饰者模式
装饰者模式可以给已经存在的对象动态的添加能力
public abstract class Girl {
String description = "no particular";
public String getDescription(){
return description;
}
}
public abstract class GirlDecorator extends Girl {
public abstract String getDescription();
}
public class Science extends GirlDecorator {
private Girl girl;
public Science(Girl girl){
this.girl = girl;
}
@Override
public String getDescription() {
return this.girl.getDescription() + "+Like Science";
}
public void caltulateStuff() {
System.out.println("scientific calculation!");
}
}
public class Art extends GirlDecorator {
private Girl girl;
public Art(Girl girl){
this.girl = girl;
}
@Override
public String getDescription() {
return this.girl.getDescription() + "+Like Art";
}
public void draw() {
System.out.println("draw pictures!");
}
}
public class Main {
public static void main(String[] args) {
//普通美国女孩
Girl g1 = new AmericanGirl();
System.out.println(g1.getDescription());
//喜欢科学的
Science g2 = new Science(g1);
System.out.println(g2.getDescription());
//喜欢科学和艺术的
Art g3 = new Art(g2);
System.out.println(g3.getDescription());
}
}
5.模板方法
模板方法模式是所有模式中最为常见的几个模式之一,是基于继承的代码复用的基本技术
好莱坞原则(don't call us, we'll call you)
public abstract class Account {
/**
* 模板方法,计算利息数额
* @return 返回利息数额
*/
public final double calculateInterest(){
double interestRate = doCalculateInterestRate();
String accountType = doCalculateAccountType();
double amount = calculateAmount(accountType);
return amount * interestRate;
}
/**
* 基本方法留给子类实现
*/
protected abstract String doCalculateAccountType();
/**
* 基本方法留给子类实现
*/
protected abstract double doCalculateInterestRate();
/**
* 基本方法,已经实现
*/
private double calculateAmount(String accountType){
/**
* 省略相关的业务逻辑
*/
return 7243.00;
}
}
public class MoneyMarketAccount extends Account {
@Override
protected String doCalculateAccountType() {
return "Money Market";
}
@Override
protected double doCalculateInterestRate() {
return 0.045;
}
}
public class CDAccount extends Account {
@Override
protected String doCalculateAccountType() {
return "Certificate of Deposite";
}
@Override
protected double doCalculateInterestRate() {
return 0.06;
}
}
public class Client {
public static void main(String[] args) {
Account account = new MoneyMarketAccount();
System.out.println(“活期账号的利息数额为:" + account.calculateInterest());
account = new CDAccount();
System.out.println("定期账号的利息数额为:" + account.calculateInterest());
}
}