JAVA的23種設計模式---中介者模式
阿新 • • 發佈:2019-02-12
概要:
該文章參考了《設計模式之禪》一書及一些前輩的部落格文章
1.該文章闡述了中介者模式的基礎原理及示例程式碼;
2.該文章適合初學設計模式的技術人員研習;
3.該文章有許多不足之處,請各位大咖指正,噴子繞道;
正文:
中介者模式:用一箇中介物件封裝一系列的物件互動,中介者使各物件不需要顯示地相互作用,從而使其耦合鬆散,而且可以獨立的改變他們之間的互動
1.中介者模式示例程式碼實現:
package com.csdn;
/**
* 抽象中介者
* @author Administrator
*
*/
public abstract class AbstractMediator {
//魏國
protected Wei wei;
//蜀國
protected Shu shu;
//吳國
protected Wu wu;
//構造器初始化三國
public AbstractMediator(){
this.wei = new Wei(this);
this.shu = new Shu(this);
this.wu = new Wu(this);
}
//最重要的事件方法,處理多個物件之間的關係
public abstract void execute(String string,Object...objects) throws Exception;
}
package com.csdn;
import java.lang.reflect.Field;
/**
* 具體中介者
* @author Administrator
*
*/
public class Mediator extends AbstractMediator{
//中介者最重要的方法,處理各方關係
@Override
public void execute(String string, Object... objects) throws Exception {
//魏國請求和平
if(string.equalsIgnoreCase("weiForPeace" )){
this.weiForPeace();
//蜀國請求和平
}else if(string.equalsIgnoreCase("shuForPeace")){
this.shuForPeace();
//吳國請求和平
}else if(string.equalsIgnoreCase("wuForPeace")) {
this.wuForPeace();
//魏國實力增長導致另外兩國實力下降
}else if(string.equalsIgnoreCase("weiIncrease")){
this.weiIncrease();
//蜀國實力增長導致另外兩國實力下降
}else if(string.equalsIgnoreCase("shuIncrease")){
this.shuIncrease();
//吳國實力增長導致另外兩國實力下降
}else if(string.equalsIgnoreCase("wuIncrease")){
this.wuIncrease();
}
}
//吳國實力增長導致另外兩國實力下降執行方法
private void wuIncrease() {
super.wei.decrease();
super.shu.decrease();
}
//蜀國實力增長導致另外兩國實力下降執行方法
private void shuIncrease() {
super.wei.decrease();
super.wu.decrease();
}
//魏國實力增長導致另外兩國實力下降執行方法
private void weiIncrease() {
super.shu.decrease();
super.wu.decrease();
}
//魏國請求和平,三國實力重置
private void weiForPeace() throws Exception {
System.out.println("魏國求和,三國實力重置!");
System.out.println("魏國實力恢復成功!"+"實力為:"+recovery(super.wei.getClass(), "WEI_STRENGTH"));
System.out.println("蜀國實力恢復成功!"+"實力為:"+recovery(super.shu.getClass(), "SHU_STRENGTH"));
System.out.println("吳國實力恢復成功!"+"實力為:"+recovery(super.wu.getClass(), "WU_STRENGTH"));
}
//蜀國請求和平,三國實力重置
private void shuForPeace() throws Exception {
System.out.println("蜀國求和,三國實力重置!");
System.out.println("魏國實力恢復成功!"+"實力為:"+recovery(super.wei.getClass(), "WEI_STRENGTH"));
System.out.println("蜀國實力恢復成功!"+"實力為:"+recovery(super.shu.getClass(), "SHU_STRENGTH"));
System.out.println("吳國實力恢復成功!"+"實力為:"+recovery(super.wu.getClass(), "WU_STRENGTH"));
}
//吳國請求和平,三國實力重置
private void wuForPeace() throws Exception {
System.out.println("吳國求和,三國實力重置!");
System.out.println("魏國實力恢復成功!"+"實力為:"+recovery(super.wei.getClass(), "WEI_STRENGTH"));
System.out.println("蜀國實力恢復成功!"+"實力為:"+recovery(super.shu.getClass(), "SHU_STRENGTH"));
System.out.println("吳國實力恢復成功!"+"實力為:"+recovery(super.wu.getClass(), "WU_STRENGTH"));
}
//通過反射,重置三國實力具體方法
public int recovery(Class clazz,String string) throws Exception{
Field fieldWei = clazz.getDeclaredField(string);
fieldWei.setAccessible(true);
fieldWei.setInt(string, 10);
return fieldWei.getInt(string);
}
}
package com.csdn;
/**
* 抽象同事類,每個國家都需實現
* @author Administrator
*
*/
public abstract class AbstractColleague {
//中介者
protected AbstractMediator mediator;
//構造器初始化中介者
public AbstractColleague(AbstractMediator _mediator){
this.mediator = _mediator;
}
//三個國家需要實現的方法
public abstract void increase() throws Exception;
public abstract void decrease();
public abstract void getStrength();
public abstract void reset() throws Exception;
}
package com.csdn;
/**
* 魏國
* @author Administrator
*
*/
public class Wei extends AbstractColleague{
//將魏國和中介者連結
public Wei(AbstractMediator _mediator) {
super(_mediator);
}
//魏國實力
private static int WEI_STRENGTH = 10;
//魏國實力增長
@Override
public void increase() throws Exception{
WEI_STRENGTH += 1;
System.out.println("魏國實力增長到:"+WEI_STRENGTH);
super.mediator.execute("weiIncrease");
}
//魏國實力下降
@Override
public void decrease(){
WEI_STRENGTH -= 1;
System.out.println("魏國實力減弱到:"+WEI_STRENGTH);
}
//顯示魏國實力
@Override
public void getStrength(){
System.out.println("魏國實力為:"+WEI_STRENGTH);
}
//魏國求和
@Override
public void reset() throws Exception{
System.out.println("魏國實力為:"+WEI_STRENGTH);
super.mediator.execute("weiForPeace");
}
}
package com.csdn;
/**
* 蜀國
* @author Administrator
*
*/
public class Shu extends AbstractColleague{
//將蜀國和中介者連結
public Shu(AbstractMediator _mediator) {
super(_mediator);
}
//蜀國實力
private static int SHU_STRENGTH = 10;
//蜀國實力增長
@Override
public void increase() throws Exception{
SHU_STRENGTH += 1;
System.out.println("蜀國實力增長到:"+SHU_STRENGTH);
super.mediator.execute("shuIncrease");
}
//蜀國實力下降
@Override
public void decrease(){
SHU_STRENGTH -= 1;
System.out.println("蜀國實力減弱到:"+SHU_STRENGTH);
}
//顯示蜀國實力
@Override
public void getStrength(){
System.out.println("蜀國實力為:"+SHU_STRENGTH);
}
//蜀國求和
@Override
public void reset() throws Exception{
System.out.println("蜀國實力為:"+SHU_STRENGTH);
super.mediator.execute("shuForPeace");
}
}
package com.csdn;
/**
* 吳國
* @author Administrator
*
*/
public class Wu extends AbstractColleague{
//將吳國和中介者連結
public Wu(AbstractMediator _mediator) {
super(_mediator);
// TODO Auto-generated constructor stub
}
//吳國實力
private static int WU_STRENGTH = 10;
//吳國實力增長
@Override
public void increase() throws Exception{
WU_STRENGTH += 1;
System.out.println("吳國實力增長到:"+WU_STRENGTH);
super.mediator.execute("wuIncrease");
}
//吳國實力下降
@Override
public void decrease(){
WU_STRENGTH -= 1;
System.out.println("吳國實力減弱到:"+WU_STRENGTH);
}
//顯示吳國實力
@Override
public void getStrength(){
System.out.println("吳國實力為:"+WU_STRENGTH);
}
//吳國求和
@Override
public void reset() throws Exception{
System.out.println("吳國實力為:"+WU_STRENGTH);
super.mediator.execute("wuForPeace");
}
}
package com.csdn;
/**
* 模擬戰場
* @author Administrator
*
*/
public class Battlefield {
public static void main(String[] args) throws Exception{
//建立中介者及三國實體物件
AbstractMediator mediator = new Mediator();
Wei wei = new Wei(mediator);
Shu shu = new Shu(mediator);
Wu wu = new Wu(mediator);
/*輸出:
魏國實力增長到:11
蜀國實力減弱到:9
吳國實力減弱到:9*/
wei.increase();
/*輸出:
吳國實力增長到:10
魏國實力減弱到:10
蜀國實力減弱到:8*/
wu.increase();
/*輸出:
蜀國實力為:8
蜀國求和,三國實力重置!
魏國實力恢復成功!實力為:10
蜀國實力恢復成功!實力為:10
吳國實力恢復成功!實力為:10*/
shu.reset();
/*輸出:
蜀國實力增長到:11
魏國實力減弱到:9
吳國實力減弱到:9*/
shu.increase();
}
}
注:
a:該示例在程式碼實現方面還可以進行部分優化
b:同事類必須有中介者,而中介者可以只有部分同事類
c:同事類的行為分為兩種,一種是同事本身的行為,用來改變自身狀態,處理自身行為,與其他的同事類和中介者沒有任何依賴,這種行為叫自發行為。還有一種是必須依賴中介者才能完成的行為,叫依賴方法
d:通常中介者模式中的同事類是協作關係,處理不同的業務。如果兩個物件不能提煉出共性,那就不要去刻意追求兩者的抽象,抽象只要去定義出模式需要的角色即可,根據專案實際情況而定(本示例為了展示的更加清晰,在同事類業務區分這方面可能不太恰當,三國相比於是同事類可能更像兄弟類)
2.中介者模式通用模型程式碼實現:
package com.csdn;
/**
* 通用抽象中介者
* @author Administrator
*
*/
public abstract class Mediator {
//定義同事類
protected ConcreteColleague1 c1;
protected ConcreteColleague2 c2;
//通過getter/setter方法把同事類注入過來
public ConcreteColleague1 getC1() {
return c1;
}
public void setC1(ConcreteColleague1 c1) {
this.c1 = c1;
}
public ConcreteColleague2 getC2() {
return c2;
}
public void setC2(ConcreteColleague2 c2) {
this.c2 = c2;
}
//中介者模式的業務邏輯
public abstract void doSomething1();
public abstract void doSomething2();
}
package com.csdn;
/**
* 通用中介者
* @author Administrator
*
*/
public class ConcreteMediator extends Mediator{
@Override
public void doSomething1() {
//呼叫同事類的方法,只要是public的都可以呼叫
super.c1.selfMethod1();
super.c2.selfMethod2();
}
@Override
public void doSomething2() {
super.c1.selfMethod1();
super.c2.selfMethod2();
}
}
package com.csdn;
/**
* 抽象同事類
* @author Administrator
*
*/
public abstract class Colleague {
protected Mediator mediator;
public Colleague(Mediator _mediator){
this.mediator = _mediator;
}
}
package com.csdn;
/**
* 具體同事類
* @author Administrator
*
*/
public class ConcreteColleague1 extends Colleague{
//通過建構函式傳遞給中介者
public ConcreteColleague1(Mediator _mediator) {
super(_mediator);
}
public void selfMethod1(){
//自己的業務邏輯
}
public void depMethod1(){
//自己的業務邏輯
//自己處理不了的業務邏輯,給中介者處理
super.mediator.doSomething1();
}
}
package com.csdn;
/**
* 具體同事類
* @author Administrator
*
*/
public class ConcreteColleague2 extends Colleague{
//通過建構函式傳遞給中介者
public ConcreteColleague2(Mediator _mediator) {
super(_mediator);
}
public void selfMethod2(){
//自己的業務邏輯
}
public void depMethod2(){
//自己的業務邏輯
//自己處理不了的業務邏輯,給中介者處理
super.mediator.doSomething2();
}
}