什麼是設計模式原則?
設計模式原則是設計設計模式的原則,也就是設計模式應當如何設計所遵守的原則;換句話說,設計模式的設計是基于設計模式原則的。
設計模式的七大原則
- 單一職責原則
- 接口隔離原則
- 依賴倒置原則
- 裡氏替換原則
- 開閉原則
- 迪米特原則
- 合成複用原則
設計原則核心思想
設計原則的目的是建構出更加穩定和健壯的軟體。而像這樣的軟體要求
- 松耦合
- 可擴充性強
1.單一職責原則(SRP Single Responsibility Principle)
什麼是單一職責原則?
一個類隻負責一項功能。
單一職責原則的目的
通過降低類的複雜度進而提高類的可讀性,可擴充性
單一職責的粒度(類與方法)
通常情況下遵守單一職責原則是在類的粒度上的,但是當代碼邏輯足夠簡單的情況下,可在方法上保持單一職責原則。
2.接口隔離原則
接口與接口隔離
接口的作用之一是規範類,實作類的松耦合,進而實作軟體的松耦合。
換句話說,接口隔離也是一種單一職責原則的實作。
接口隔離原則的目的
接口隔離原則的要求就是明确接口功能,盡可能細分接口。
接口的細化直接導緻整個系統靈活性,但同時會帶來結構的複雜性。
比如說預先定義了10個接口,為了滿足接口隔離而将接口分成20個。那麼類在實作接口上會變得更加靈活,但接口的增多會導緻結構的複雜性。
3.依賴倒置原則
依賴于抽象,不要依賴于具體。
依賴倒置的是什麼?
類與類之間依賴變為類對接口的依賴。
[from 百度百科]

目的
解耦,增強子產品複用性。
依賴倒置原則的思想與Spring IOC容器機制相呼應,類對于接口的依賴降低了類之間的耦合性,而IOC中類對于容器的依賴同樣解決了類之間高耦合的問題。
依賴關系傳遞的三種方式
- 接口傳遞
- 構造方法傳遞
- setter傳遞
//接口傳遞
interface Car
{
void drive();
}
interface Person
{
void lunch(Car car);
}
//構造方法傳遞
interface Bicycle
{
void ride();
}
class Tom
{
private Bicycle bicycle;
Tom(Bicycle bicycle)
{
this.bicycle=bicycle;
}
}
//setter方法傳遞
interface Weather
{
void sun();
}
class Today
{
private Weather weather;
public void setWeather(Weather weather) {
this.weather = weather;
}
}
複制
4.裡氏替換原則
繼承的利與弊
利:實作了代碼重用,更加友善的實作了功能擴充。
弊:增強了類之間的耦合性
什麼是裡氏替換原則?
在子類中盡量不要重寫父類的方法。
如果不得不重寫,可提取出基類共同繼承。另外也可通過聚合,依賴,組合的方式替代繼承。
class A
{
public void a1(){
}
public void a2(){
}
}
class B extends A
{
@Override
public void a1()
{
}
}
//提取基類後
class Base
{
public void a2
{
}
}
class A extends Base
{
public void a1(){
}
}
class B extends Base
{
public void a1(){
}
}
複制
5.開閉原則(OCP Open Closed Principle)
什麼是開閉原則?
對擴充開放,對修改關閉。
通俗的說,在軟體功能需要擴充時,盡量增加代碼,而不是修改原有代碼。
for example
abstract class Action
{
abstract public void action();
}
class Describe
{
public void describe(Action action)
{
action.action();
}
}
class A extends Action
{
public void action()
{
System.out.println("跑步");
}
}
class B extends Action
{
public void action()
{
System.out.println("瑜伽");
}
}
class C extends Action
{
public void action()
{
System.out.println("健身");
}
}
class X extends Action
{
public void action()
{
System.out.println("xxx");
}
}
public class Main
{
public static void main(String[] args)
{
Describe describe = new Describe();
describe.describe(new A());
describe.describe(new B());
describe.describe(new C());
describe.describe(new X());
}
}
複制
定義一個抽象類,其中有action方法,ABC類都有各自的行為,繼承抽象類後重寫方法。這些需要擴充新功能時隻需新加一個像X一樣的類就可以了。基本上不需要修改任何位置,隻是擴充了功能。
6.迪米特原則(最少知識原則)
什麼是迪米特原則?
一個對象應該對其他對象保持最少的了解。
表現形式
隻與直接的朋友通信。
直接的朋友:除了出現在局部變量的類之外,都是直接朋友。
換句話說:迪米特法則要求局部變量中最好不要出現陌生的類。
目的
降低類之間的耦合。(耦合隻能盡量降低,無法消除)
7.合成複用原則
盡量使用合成/聚合代替繼承。
合成/聚合:某種類與類之間建立聯系的方式。其耦合度低于繼承。
參考資料:
設計模式之六大原則——接口隔離原則(ISP)
依賴倒置原則
面向對象原則之一 依賴倒置原則
對依賴倒置原則(DIP)及Ioc、DI、Ioc容器的一些了解
裡氏替換原則