表格布局的网站,html购物网站设计,wordpress采集网址,网站制作还花钱前言
什么是门面模式
门面模式是一种结构型设计模式#xff0c;它提供了一个统一的接口#xff0c;用来访问子系统中的一群接口。它定义了一个高层接口#xff0c;让子系统更容易使用。这种模式常用于将一个复杂的子系统封装成一个简单的接口#xff0c;使得客户端可以方… 前言
什么是门面模式
门面模式是一种结构型设计模式它提供了一个统一的接口用来访问子系统中的一群接口。它定义了一个高层接口让子系统更容易使用。这种模式常用于将一个复杂的子系统封装成一个简单的接口使得客户端可以方便地使用子系统的功能而不需要了解子系统的具体实现细节。
门面模式的特点
代理模式能够隐藏真实对象的实现细节使客户端无需知晓真实对象的工作方式和结构。通过代理类来间接访问真实类可以在不修改真实类的情况下对其进行扩展、优化或添加安全措施。代理模式实现起来简单易于扩展和维护符合面向对象设计原则中的开闭原则。
门面模式的核心角色
门面模式Facade Pattern有三个核心角色
门面角色Facade这是门面模式的核心被客户角色调用。它熟悉子系统的功能内部根据客户角色已有的需求预定了几种功能组合。子系统角色Subsystem实现了子系统的功能。对于子系统角色来说门面角色和客户角色都是未知的它没有任何门面角色信息和链接。客户角色Client这是使用门面模式的外部请求者它通过门面角色来访问子系统以获取所需的功能。 门面模式如何实现
假如用门面模式来模拟实现一下去饭店点菜吃饭应该怎么实现呢虽然去饭店吃饭这件事挺普通的但是要想吃到饭起码是要走这样一个流程点餐、炒菜、上菜、收/付钱。其实这里的饭店就可以看作是一个门面角色饭店内不同的角色如老板、收银员、服务员、厨师等可以看作是饭店这个门面内的子系统角色不同的角色职责是不同的服务员负责帮客人点餐、上菜厨师炒菜收银员负责收钱但是对于客人而言吃饭是重点通常不会关注是谁做的、谁端上来的。
那使用门面模式怎么实现呢UML类图如下 1、Restaurant饭店类有三个List类型的属性分别用来表示饭店内会有厨师、服务员、收银员等不同角色的人员对象对应还有三个可以给饭店增加三种不同角色人员的方法最后一个方法就是饭店对外的主要职能可以吃饭
2、Waiter服务员类有两个方法帮客人下单、上菜
3、Cook厨师类有一个方法炒菜
4、Cashier收银员类有一个方法收菜
5、Cilent:客户端类作为客户端直接依赖Restaurant类而不具体去找某个服务员或厨师
/*** 服务员*/
Data
AllArgsConstructor
public class Waiter {private String name;public void placeOrder(){System.out.println(this.name-帮客人点菜);}public void serveDishes(){System.out.println(this.name-给客人上菜);}
}
/*** 厨师*/
Data
AllArgsConstructor
public class Cook {private String name;public void cooking() {System.out.println(this.name -炒菜);}
}
/*** 收银员*/
Data
AllArgsConstructor
public class Cashier {private String name;public void collectMoney() {System.out.println(this.name -收钱);}
}
/*** 饭店*/Data
public class Restaurant {private String name;private ListCook cooks new ArrayList();private ListWaiter waiters new ArrayList();private ListCashier cashiers new ArrayList();public Restaurant(String name) {this.name name;}public void addCooks(Cook cook) {this.cooks.add(cook);}public void addWaiter(Waiter waiter) {this.waiters.add(waiter);}public void addCashier(Cashier cashier) {this.cashiers.add(cashier);}private int ranomInt(Integer maxInt){Random random new Random();return random.nextInt(maxInt);}public void eat(){this.waiters.get(this.ranomInt(this.waiters.size())).placeOrder();//点菜this.cooks.get(this.ranomInt(this.cooks.size())).cooking();//炒菜this.waiters.get(this.ranomInt(this.waiters.size())).serveDishes();//上菜System.out.println(客人-吃饭);this.cashiers.get(this.ranomInt(this.cashiers.size())).collectMoney();//收钱}
}
public class Client {public static void main(String[] args) {Restaurant restaurant new Restaurant(和平饭店);Cook cook1 new Cook(张厨师);Cook cook2 new Cook(李厨师);restaurant.addCooks(cook1);restaurant.addCooks(cook2);Waiter waiter1 new Waiter(王小红);Waiter waiter2 new Waiter(张小月);restaurant.addWaiter(waiter1);restaurant.addWaiter(waiter2);Cashier cashier1 new Cashier(老板);Cashier cashier2 new Cashier(老板娘);restaurant.addCashier(cashier1);restaurant.addCashier(cashier2);restaurant.eat();}
} 门面模式的适用场景
门面模式适用于以下场景
为一个复杂的子系统提供一个简单的接口使得客户端可以方便地使用子系统的功能。需要对一个子系统进行封装并隐藏子系统的内部实现细节只提供一个精简的接口供客户端使用这样可以降低客户端与子系统的耦合度。需要提高子系统的独立性使得客户端不直接与子系统交互而是通过门面角色来进行交互。需要隔离客户端与子系统的直接交互预防低水平人员带来的风险扩散。
总结
优点
减少系统的相互依赖门面模式可以让客户端只需要依赖门面对象而与子系统无关。这样可以降低系统耦合度。提高灵活性通过门面角色客户端不再直接与子系统交互而是通过门面角色提供的精简接口来实现交互。这样子系统的内部实现细节可以被隐藏起来子系统如何变化对客户端来说是透明的提高了系统的灵活性。提高安全性外部只能通过门面访问子系统的功能门面没有开放的就不能访问提高了子系统的安全性。
缺点
不符合开闭原则。系统投产后一旦发现错误只能修改门面角色的代码风险比较大。系统的复杂性和理解难度有一定增加
总的来说门面模式可以简化复杂子系统的使用、隐藏实现细节、提高子系统独立性和隔离客户端与子系统的直接交互但也存在一些缺点需要注意。在具体使用时需要根据具体情况进行权衡并考虑是否适合使用该模式。