日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
架構(gòu)師備戰(zhàn)軟件工程之行為型設(shè)計(jì)模式

1、狀態(tài)模式

簡(jiǎn)要說(shuō)明

允許一個(gè)對(duì)象在其內(nèi)部改變時(shí)改變它的行為

目前創(chuàng)新互聯(lián)建站已為上1000+的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、網(wǎng)站托管維護(hù)、企業(yè)網(wǎng)站設(shè)計(jì)、右玉網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。

速記關(guān)鍵字

狀態(tài)變成類

類圖如下

狀態(tài)模式主要用來(lái)解決對(duì)象在多種狀態(tài)轉(zhuǎn)換時(shí),需要對(duì)外輸出不同的行為的問(wèn)題。比如訂單從待付款到待收貨的咋黃臺(tái)發(fā)生變化,執(zhí)行的邏輯是不一樣的。

所以我們將狀態(tài)抽象為一個(gè)接口或者抽象類,對(duì)不同狀態(tài)進(jìn)行封裝成單獨(dú)的實(shí)體,用于實(shí)現(xiàn)各種狀態(tài)處理的邏輯。

再設(shè)計(jì)一個(gè)上下文類,它組合了狀態(tài)接口,用于發(fā)送請(qǐng)求。針對(duì)不同的狀態(tài)提供不同的處理方法即可。

Java代碼實(shí)現(xiàn)

/**
* 狀態(tài)接口 提供處理狀態(tài)的方法
*/
public interface IState {

// 處理狀態(tài),交給實(shí)現(xiàn)類實(shí)現(xiàn)
void handleState();
}

/**
* 未付款狀態(tài)
*/
public class UnpaidState implements IState{
@Override
public void handleState() {
System.out.println("下單成功,訂單狀態(tài)為待付款");
}
}

/**
* 已付款狀態(tài)
*/
public class PaidState implements IState{
@Override
public void handleState() {
System.out.println("支付成功,訂單狀態(tài)為已付款");
}
}

/**
* 已取消狀態(tài)
*/
public class CancelState implements IState{
@Override
public void handleState() {
System.out.println("訂單取消支付,訂單狀態(tài)為已取消");
}
}

/**
* 訂單狀態(tài)上下文類
*/
public class Context {
// 組合訂單狀態(tài)
private final IState state;

public Context(IState state) {
this.state = state;
}

// 提供處理訂單方法
public void handleOrderByState(){
state.handleState();
}
}

/**
* 測(cè)試類
*/
public class Client {
public static void main(String[] args) {
// 創(chuàng)建上下文并創(chuàng)建未支付狀態(tài)
Context context = new Context(new UnpaidState());
context.handleOrderByState();

// 創(chuàng)建上下文并創(chuàng)建已支付狀態(tài)
Context context2 = new Context(new PaidState());
context2.handleOrderByState();
}
}

結(jié)果輸出

其實(shí)我們可以看出來(lái),狀態(tài)模式和策略模式非常像,都有一個(gè)Context類,都有一個(gè)接口或抽象類被Context組合。而后抽象類或接口有自己的不同實(shí)現(xiàn)。

它們確實(shí)很像,但是它們確實(shí)有區(qū)別,因?yàn)闋顟B(tài)模式圍繞著狀態(tài)的變化,它的子類之間的狀態(tài)是可以進(jìn)行轉(zhuǎn)換的,比如訂單狀態(tài)由未付款變?yōu)橐迅犊?。但是策略模式則不會(huì),只會(huì)二者取其一,進(jìn)行一種策略操作。

2、訪問(wèn)者模式

簡(jiǎn)要說(shuō)明

表示一個(gè)作用域某對(duì)象結(jié)構(gòu)中的個(gè)元素的操作,使得在不改變各元素的前提下定義作用域這些元素的新操作。

速記關(guān)鍵字

數(shù)據(jù)與操作分離

類圖如下

角色說(shuō)明

  • Visitor(抽象訪問(wèn)者):為每種具體的被訪問(wèn)者(ConcreteElement)聲明一個(gè)訪問(wèn)操作
  • ConcreteVisitor(具體訪問(wèn)者):實(shí)現(xiàn)對(duì)被訪問(wèn)者(ConcreteElement)的具體訪問(wèn)操作,所以需要組合多個(gè)元素,也就是組合一組元素集合
  • Element(抽象被訪問(wèn)者):通常有一個(gè)Accept方法,用來(lái)接收/引用一個(gè)抽象訪問(wèn)者對(duì)象(基本原理)
  • ConcreteElement(具體被訪問(wèn)者對(duì)象):實(shí)現(xiàn)Accept抽象方法,通過(guò)傳入的具體訪問(wèn)者參數(shù)、調(diào)用具體訪問(wèn)者對(duì)該對(duì)象的訪問(wèn)操作方法實(shí)現(xiàn)訪問(wèn)邏輯
  • Clent、ObjectStructure(客戶端訪問(wèn)過(guò)程測(cè)試環(huán)境):該過(guò)程中,被訪問(wèn)者通常為一個(gè)集合對(duì)象,通過(guò)對(duì)集合的遍歷完成訪問(wèn)者對(duì)每一個(gè)被訪問(wèn)元素的訪問(wèn)操作;

Java代碼實(shí)現(xiàn)

/**
* 定義被訪問(wèn)接口
*/
public interface Person {
// 提供一個(gè)方法,讓訪問(wèn)者可以訪問(wèn)
void accept(Action action);
}

/**
* 訪問(wèn)者,這里提供了多個(gè)訪問(wèn)方法,從而獲取多個(gè)不同的訪問(wèn)結(jié)果,它們的參數(shù)分別對(duì)應(yīng)具體的被訪問(wèn)元素
*/
public interface Action {
// 得到男性 的測(cè)評(píng)
void getManResult(Man man);

// 得到女的 測(cè)評(píng)
void getWomanResult(Woman woman);
}

/**
* 被訪問(wèn)者元素男人實(shí)現(xiàn),傳入自己給訪問(wèn)者訪問(wèn)
*/
public class Man implements Person{
@Override
public void accept(Action action) {
action.getManResult(this);
}
}

/**
* 被訪問(wèn)者元素女人實(shí)現(xiàn),傳入自己給訪問(wèn)者訪問(wèn)
*/
public class Woman implements Person{
@Override
public void accept(Action action) {
action.getWomanResult(this);
}
}

/**
* 訪問(wèn)者實(shí)現(xiàn)類 對(duì)不同的被訪問(wèn)元素做不同的訪問(wèn)
*/
class Success implements Action {

@Override
public void getManResult(Man man) {
System.out.println("男人給的評(píng)價(jià): 歌手很表演很nice");
}

@Override
public void getWomanResult(Woman woman) {
System.out.println("女人給的評(píng)價(jià): 歌手很表演很nice");
}
}

class Normal implements Action {
@Override
public void getManResult(Man man) {
System.out.println("男人給的評(píng)價(jià)是: 歌手很表演比較普通");
}

@Override
public void getWomanResult(Woman woman) {
System.out.println("女人給的評(píng)價(jià)是: 歌手很表演比較普通");
}
}

public class Fail implements Action {
@Override
public void getManResult(Man man) {
System.out.println("男人給的評(píng)價(jià): 歌手很表演有點(diǎn)糟糕");
}

@Override
public void getWomanResult(Woman woman) {
System.out.println("女人給的評(píng)價(jià): 歌手很表演有點(diǎn)糟糕");
}
}

/**
* 數(shù)據(jù)結(jié)構(gòu),管理很多人(Man , Woman)
*/
class ObjectStructure {
//維護(hù)了一個(gè)集合
private List persons = new LinkedList<>();

//添加
public void add(Person p) {
persons.add(p);
}

//刪除
public void delete(Person p) {
persons.remove(p);
}

// 顯示測(cè)評(píng)情況(便利)
public void show(Action action) {
for (Person p : persons) {
p.accept(action);
}
}
}

/**
* 測(cè)試類
*/
public class Client {
public static void main(String[] args) {
// 使用數(shù)據(jù)結(jié)構(gòu)來(lái)創(chuàng)建
ObjectStructure os = new ObjectStructure();
// 添加我們我們的訪問(wèn)者
os.add(new Man());
os.add(new Woman());


// 創(chuàng)建成功的被訪問(wèn)者
Success success = new Success();
// 通過(guò)數(shù)據(jù)結(jié)果遍歷訪問(wèn)者,然后進(jìn)行訪問(wèn)成功的數(shù)據(jù)
os.show(success);
System.out.println("========================");

// 創(chuàng)建失敗的被訪問(wèn)者
Fail fail = new Fail();
// 通過(guò)數(shù)據(jù)結(jié)果遍歷訪問(wèn)者,然后進(jìn)行訪問(wèn)失敗的數(shù)據(jù)
os.show(fail);
System.out.println("========================");

// 創(chuàng)建中肯的的被訪問(wèn)者
Normal normal = new Normal();
os.show(normal);
}
}

其實(shí)訪問(wèn)者模式和觀察者模式的思想也非常類似,代碼實(shí)現(xiàn)也很類似。都會(huì)提供一個(gè)管理被訪問(wèn)者/觀察者集合,提供新增和刪除方法,并且提供一個(gè)遍歷集合的方法,并通知所有元素或者指定元素的方法。

它們只是應(yīng)用場(chǎng)景不一樣,其實(shí)類圖都很類似。

結(jié)果輸出

3、小結(jié)

其實(shí)我們可以看出,狀態(tài)模式和策略模式很類似,簡(jiǎn)直就是親兄弟一樣。而訪問(wèn)者模式其實(shí)和觀察者模式也很類似。所以我們的設(shè)計(jì)模式設(shè)計(jì)到最后,可能就會(huì)存在一種模式里有另一種模式的影子。所以我們要搞清楚它們之間的區(qū)別。


網(wǎng)頁(yè)名稱:架構(gòu)師備戰(zhàn)軟件工程之行為型設(shè)計(jì)模式
當(dāng)前路徑:http://www.5511xx.com/article/cdigoij.html