二十三种设计模式(三)

12.外观模式

外观模式(Facade),隐藏了系统的复杂性,并向客户端提供了一个可以访问系统的接口。这种类型的设计模式属于结构性模式。为子系统中的一组接口提供了一个统一的访问接口,这个接口使得子系统更容易被访问或者使用。

简单来说,该模式就是把一些复杂的流程封装成一个接口供给外部用户更简单的使用。这个模式中,设计到3个角色。

  1).门面角色:外观模式的核心。它被客户角色调用,它熟悉子系统的功能。内部根据客户角色的需求预定了几种功能的组合。

  2).子系统角色:实现了子系统的功能。它对客户角色和Facade时未知的。它内部可以有系统内的相互交互,也可以由供外界调用的接口。

  3).客户角色:通过调用Facede来完成要实现的功能。

13.享元模式

场景:内存属于稀缺资源,不能随便浪费。如果有多个相同或者类似的对象,我们可以通过享元模式来节省内存。

核心:享元模式以共享的方式高效的支持大量细粒度对象的重用。

关键:享元模式能做到共享的方式关键是能区分内部状态与外部状态:

  内部状态:可以共享,不会随环境的变化而改变。

  外部状态:不可以共享,随环境的变化而改变。

类图:

//抽象享元类
public
interface ChessFlyWeight { void setColor(String Color); String getColor(); void display(Coordinate c); } //具体享元类 public class ConcreteChess implements ChessFlyWeight{ private String color; @Override public void setColor(String Color) { // TODO Auto-generated method stub this.color = color; } @Override public String getColor() { // TODO Auto-generated method stub return this.color; } @Override public void display(Coordinate c) { // TODO Auto-generated method stub System.out.println("棋子颜色是"+color); System.out.println("位置是"+c.getX()+"______"+c.getY()); } public ConcreteChess(String color) { super(); this.color = color; } }
//非共享享元类
public class Coordinate{ private int x,y; public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } public Coordinate(int x, int y) { super(); this.x = x; this.y = y; } }
//享元工厂类
public class ChessFlyWeightFactory { private static Map<String,ChessFlyWeight> map = new HashMap<String,ChessFlyWeight>(); public static ChessFlyWeight getChess(String color){ if(map.get(color)!=null){ return map.get(color); }else{ ChessFlyWeight chess = new ConcreteChess(color); map.put(color, chess); return chess; } } } public class Client { public static void main(String[] args) { ChessFlyWeight chessFlyWeight = ChessFlyWeightFactory.getChess("黑色"); ChessFlyWeight chessFlyWeight2 =ChessFlyWeightFactory.getChess("黑色"); System.out.println(chessFlyWeight); System.out.println(chessFlyWeight2); Coordinate c = new Coordinate(10, 20); chessFlyWeight.display(c); Coordinate c1 = new Coordinate(20, 30); chessFlyWeight2.display(c1); } }
运行结果:

com.moon.FlyWeight.ConcreteChess@1db9742
com.moon.FlyWeight.ConcreteChess@1db9742
棋子颜色是黑色
位置是10______20
棋子颜色是黑色
位置是20______30

 

享元模式应用场景:数据库连接池、线程池、String类的设计。

优点:极大的减少内存中对象的数量、相似或相同的对象内存中只存一份,提高系统性能、外部状态相对独立,不影响内部状态。

缺点:模式较复杂,使程序逻辑复杂化、以时间换空间,读取外部状态时间变长。

  

猜你喜欢

转载自www.cnblogs.com/menbo/p/10165892.html
今日推荐