理论写着写着就明白了
应用场景
- 集中管理资源
- 解耦功能,增加可扩展性
- 门面对外 | 调停对内
这回先来上个图
大家来看这个图,我们去办事找到办事处1说办事处2能办理,办事处2又说办事处3能办理,以此类推…我们要想办成一件事可就太繁琐了。
由此我们就引出了门面模式:
大家来看这个图,当门面(Facade)出现时,我们功能对外的这层联系就变的非常清晰,来访者不再需要跟我们具体的功能部门打交道,只需要将请求交由门面来处理即可
大家再看这个图,办事处内部各个只能不同,部门与部门直接的交流联系复杂,混乱,为了解决我们功能内部联系问题,引出了调停者模式:
大家可以从图中清晰的感觉到,当调停(Mediator)出现的时候,我们的条理非常的清晰,部门之间不再单独联系,所有问题交由调停者来处理
二话不说再上代码
public class TankFrame extends Frame {
//这里是我模板中需要的各种物体
Tank myTank = new Tank(GAME_WIDTH / 2 - Tank.WIDTH / 2, GAME_HEIGHT - Tank.HEIGHT, Dir.UP, Group.GOOD, this);
List<Bullet> bullets = new ArrayList<Bullet>();
List<Tank> tanks = new ArrayList<>();
List<Explode> explodes = new ArrayList<>();
public void paint(Graphics g) {
//这里是画出各种物体模型的功能
tank.paint(g);
bullet.paint(g);
...
}
}
大家可以看到,我的模板里面有各种各样的物体,坦克,子弹,爆炸;将来我还要再添加障碍物,地雷,导弹等等一系列的新物体,这个时候如果我们还再模板里面去进行处理,每次我都需要修改模板的代码,有点不太合适了,这样我们需要一个物体模型的类也就是我们的大管家门面来帮我们管理这些物体的生老病死。
public class TankFrame extends Frame {
GameModel gm = GameModel.getInstance();
}
public class GameModel {
private static final GameModel gm = new GameModel();
public static GameModel getInstance() {
return gm;
}
//我的所有模型抽出一个抽象的父类GameObject让所有模型集成它
private List<GameObject> objects = new ArrayList<>();
/*Tank myTank = new Tank(500, 360, Dir.UP, Group.GOOD, this);
*List<Bullet> bullets = new ArrayList<>();
*List<Tank> tanks = new ArrayList<>();
*List<Explode> explodes = new ArrayList<>();*/
private GameModel() {
//初始化操作
}
public void paint(Graphics g) {
//模型处理全部交由模型门面来管理 后续增加新的模型 只需要操作GameModel即可
for (int i = 0; i < objects.size(); i++) {
objects.get(i).paint(g);
}
}
}
public abstract class GameObject {
int x, y;
public abstract void paint(Graphics g);
}
这样修改之后,大家可以看到:
对于外部来说我们要想添加一个新的物体,只需要跟GameModel打交道即可。
而对于我们内部来说,每个物体之间不再相互捆绑,直接操作GameObject即可。