策略模式、上下文与内部类的思考
2019獨角獸企業重金招聘Python工程師標準>>>
策略模式簡介
???????? 策略模式一直程序開發中,最常用的模式之一;它的功能就是定義了一系列的算法,這些算法定義著公共的接口,所以它們之間可以相互替換。這使得我們在開發過程中,若有新的策略需要擴展時,程序變的很容易開發。下面是策略模式的結構示意圖:
?
???????? 從結構示意圖中,我們能清楚的感受到,策略模式的巧妙之處就是將變化的東西(這里我們稱之為算法)通過定義一個相同的公共的接口封裝且隔離;以不同的策略實現相同的接口,使程序能夠完成各種任務的同時,讓上層的編程針對接口,實現不變,也不關心其調用的是哪種策略。
?
上下文的引入
???????? 然而在實際開發中,我們的需求往往不會像結構示意圖那樣,如此簡單、如此simple。實際較為常見的情況就是:上層的調用需要與接口之間有一定的交互。交互的可能是一些屬性,或是一些方法。這樣的交互往往會讓接口變的難以調用;于是上下文的引入就是勢在必行。將相關的屬性或一些公共的方法封裝到上下文中,讓上下文去和接口進行復雜的交互。而上層的調用只需要跟上下文打交道就可以。下面有包含上下文的策略模式結構示意圖:
???????? 仔細看看兩個結構示意圖的變化,其實不外乎將變的東西和不變的東西進行封裝與隔離,這樣不變的東西能夠盡可能的減小其變化,而變的東西更容易修改或擴充;其實這也正是軟件設計的基本原則。
???????? 透過示意圖,我們上下文對象,將自己傳遞給接口,方便接口調取它的屬性與方法,以完成交互。如此將前面提到的交互的行為提取出來,封裝在自己內部,對上層提供統一調用方法。也正是將變化與不變封裝且隔離。
?
延遲設計與內部類
???????? 正如前面提到的,上下文中封裝了上層調用類與接口間的交互;但這些交互有個前提,那就是它們能被抽象出來。另一些交互在我們的業務需求中無法被抽象出來。換句話說,這些交互,就是要延遲到上層調用內中來設計與實現的。在這種情況下:上層調用類與接口的某個策略的實現往往是緊耦合的、并且它們是一對一。
???????? 要完成它們之間的這種交互,設計它們間通訊的方法,會讓代碼變雜亂,同時也增加了調用接口的難度。
???????? 這時內部類的優勢可以在此發揮:我們將接口的實現類放到上層調用類中,變成上層調用類的一個內部類;由于內部類可以任意調用其外部類的屬性和方法的特性。它們能直接的無阻礙的通訊,完全不同設計多余的接口方法來完成交互;如此一來也正好符合它們一對一的關系。下面是我簡單寫的一個小Demo:
?策略接口:
/*** 策略算法接口* @author Breath_L**/ public interface Strategy {public void doStrategy(Context cont); }
上下文類:
/*** 上下文類* @author Breath_L**/ public class Context {private String baseTxt;private Strategy strategy;public Context(String baseTxt, Strategy strategy){this.baseTxt = baseTxt;this.strategy = strategy;}/*** 暴露給上層對象調用的方法*/public void doStrategyNow(){//公共邏輯...System.out.println(baseTxt);strategy.doStrategy(this);//公共邏輯...} }
上層調用類:
public class TopGetter {public Strategy in_strategy;public Context context;public TopGetter(){in_strategy = new Strategy(){@Overridepublic void doStrategy(Context cont) {System.out.println(beDependent()); }};context = new Context("Hello World !", in_strategy);}private String beDependent(){return "We will rock you !";}public void startHere(){context.doStrategyNow();}public static void main(String[] args){TopGetter topGetter = new TopGetter();topGetter.startHere();} }???????? 仔細思考上下文和內部類,它們算是策略模式在封裝和隔離變與不變的東西時,的一個深入設計。萬變不離其中的還是軟件設計的基本原則。還是那句話:沒有最完美的設計,只有最符合業務的實現。也許此刻的思考只是符合我最近的業務,不怕見笑,做一下記錄與分享。
????? ? 原創博客,轉載請注明:http://my.oschina.net/BreathL/blog/52655
轉載于:https://my.oschina.net/BreathL/blog/52655
總結
以上是生活随笔為你收集整理的策略模式、上下文与内部类的思考的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 尽力而为
- 下一篇: Win7重启后IP地址无效