二十三种设计模式(九)门面模式

门面模式:当一个稳定的系统需要与外部其他系统交互时,可以定义一个门面类使得所有来自外部系统的交互都由门面类完成。

如下是一个户籍迁移场景的例子

/**

* 地点

* */

public interface Place {

//迁入

public void immigration(Person p, int paper);

//迁出

public int emigration(Person p,int paper);

//申请

public int apply(Person p,int paper);

}

/**

* A地

* */

public class PlaceA implements Place{

@Override

public void immigration(Person p, int paper) {

p.p = new PlaceA();

System.out.println("迁出证明无误,准许迁入A地");

}

@Override

public int emigration(Person p,int paper) {

System.out.println("准迁证无误,允许从B地迁出,获得迁出证明");

return 3;

}

@Override

public int apply(Person p,int paper) {

System.out.println("提交申请迁入A地,获得准迁证");

return 2;

}

}

/**

* B地

* */

public class PlaceB implements Place{

@Override

public void immigration(Person p, int paper) {

p.p = new PlaceB();

System.out.println("迁出证明无误,准许迁入B地");

}

@Override

public int emigration(Person p,int paper) {

System.out.println("准迁证无误,允许从B地迁出,获得迁出证明");

return 3;

}

@Override

public int apply(Person p,int paper) {

System.out.println("提交申请迁入B地,获得准迁证");

return 2;

}

}

public class Person {

//户口所在地

public Place p = new PlaceA();

/*

* Place-要去的地点

* event - 要办的事 3-代表迁入 2-代表迁出 1-代表申请迁入

* paper - 证件 1-户口 2-准迁入证明 3-迁出证明

* */

public int go(Place place,int event,int paper){

if(event ==1){

return place.apply(this,paper);

}else if(event ==2){

return place.emigration(this,paper);

}else {

place.immigration(this,paper);

return 0;

}

}

}

public class Main {

public static void main(String[] args) {

//未优化前,实现小明迁户口从A地迁到B地

Person xiaoming = new Person();

//1.去B地提交迁入申请,提交户口,获得准迁入证

int paper1 = xiaoming.go(new PlaceB(),1,1);

//2.回到A地,办理迁出,提交准迁入证,获得迁出证明

int paper2 = xiaoming.go(new PlaceA(),2,paper1);

//3.回到B地,办理迁入,提交迁出证明,户口迁移完成

xiaoming.go(new PlaceB(),3,paper2);

}

}

此时可以看到,完成户籍迁移需要同多个地方类的多个方法进行交互调用,非常麻烦。此时引入一个代办类。使得整个户籍迁移系统只对外开发代办类,

public class Commission {

/*

* 户籍变更方法

* Person p 人

* paper 证件

* Place place1 户籍所在地

* Place place1 目标户籍地

* */

public static void placeChange(Person p, int paper, Place place1, Place place2){

int paper1=p.go(place2,1,paper);

int paper2 = p.go(place1,2,paper1);

p.go(place2,3,paper2);

}

}

/**

* 实现xiaoming户口迁移

* */

public class Main {

public static void main(String[] args) {

Commission.placeChange(xiaoming,1,new PlaceA(),new PlaceB());

}

}

可以看到,程序代码减轻很多,繁琐流程都在系统内部统一完成。只需要办理人提供证件即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值