講完告終構型設計模式,接下里就是行爲型設計模式了。java
定義一系列的算法,把每個算法封裝起來,而且使它們可相互替換。git
在初中寫關於多邊形的題目的時候,咱們可能經過已知方法硬生生解答出來,也有可能用輔助線來幫助咱們解題。這就是兩種解題策略。 下面用代碼體現一下。github
/** * 上下文 * 根據傳入策略給出解決方法 */
public class Context {
private Strategy strategy;
Context(Strategy strategy){
this.strategy = strategy;
}
void solve(){
strategy.solve();
}
}
/** * 兩種策略方法 * 1. 輔助線法 * 2. 硬答 */
public class SoftStrategy implements Strategy {
@Override
public void solve() {
System.out.println("輔助線解答");
}
}
public class HardStrategy implements Strategy {
@Override
public void solve() {
System.out.println("硬生生解答");
}
}
/** * 抽象策略角色 */
public interface Strategy {
void solve();
}
複製代碼
根據不一樣的策略往上下文角色裏傳入對象,就能獲得具體的實現方法。算法
定義一個操做中的算法框架,而將一些步驟延遲到子類中,使得子類不改變一個算法的結構便可重定義算法的某些特定步驟。設計模式
模版方法模式中的角色:框架
/** * 模版抽象類 * 定義了一套邏輯方法,而子類只負責繼承和完善。 */
public abstract class AbstractPerson {
public final void wakeup(){
zhengyan();
xianbeizi();
qichuang();
hook();
}
abstract void zhengyan();
abstract void xianbeizi();
abstract void qichuang();
void hook(){}
}
/** * 具體實現類 */
public class Me extends AbstractPerson {
@Override
void zhengyan() {
System.out.println("睜開眼睛");
}
@Override
void xianbeizi() {
System.out.println("掀被子");
}
@Override
void qichuang() {
System.out.println("起牀");
}
@Override
void hook() {
super.hook();
System.out.println("又想睡了");
}
}
複製代碼
hook()
方法,稱爲鉤子方法,兩種實現方式。ide
boolean
做爲返回值的,對某個條件進行斷定。定義對象間一種一對多的依賴關係,每當一個對象改變狀態時,則全部依賴於它的對象都會獲得通知並被自動更新。函數
該模式中的角色:工具
/** * 抽象觀察者類 */
public interface IObserver {
void update(String message);
}
/** * 抽象主題類 */
public interface ISubject {
void add(IObserver observer);
void remove(IObserver observer);
void notify(String message);
}
/** * 具體觀察者類 */
public class Observer implements IObserver {
@Override
public void update(String message) {
System.out.println(message);
}
}
/** * 具體主題類 */
public class Subject implements ISubject {
List<IObserver> list = new ArrayList<>();
@Override
public void add(IObserver observer) {
list.add(observer);
}
@Override
public void remove(IObserver observer) {
list.remove(observer);
}
@Override
public void notify(String message) {
for(IObserver observer: list){
observer.update(message);
}
}
}
複製代碼
這個模式聽着優勢奇怪,可是代碼寫起來其實一點都不生疏。其實就是使用主題類保存各個觀察者,出現變化的話就循環遍歷,慢慢通知。post
這個模式在個人Android工具包的Network包中也有使用。
可是這個模式存在一個缺點,由於它是一個個進行通知的,那麼update()
函數中是可能存在耗時操做的。這個時候,比較建議的就是開一個子線程去進行處理,這樣在Android中不會對UI線程產生過多的佔用。
以上就是個人學習成果,若是有什麼我沒有思考到的地方或是文章內存在錯誤,歡迎與我分享。
相關文章推薦: