门面模式:当一个稳定的系统需要与外部其他系统交互时,可以定义一个门面类使得所有来自外部系统的交互都由门面类完成。
如下是一个户籍迁移场景的例子
/**
* 地点
* */
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());
}
}
可以看到,程序代码减轻很多,繁琐流程都在系统内部统一完成。只需要办理人提供证件即可