概述
一、桥接模式
桥接模式将抽象部分与它的具体实现部分分离,使它们都可以独立地变化。它可以将类中存在的独立变化的维度都分离出来,让它们独立变化,减少它们之间的耦合,但是需要我们正确识别出系统中那些独立变化的维度,而且这些维度之间是通过组合的方式建立联系的。符合开闭原则。
这个例子中,银行类依赖账户类,也就是说抽象部分是银行,具体实现是账户。
账户接口:
public interface Account {
Account openAccount();
void showAccountType();
}
活期账户类:
public class SavingAccount implements Account {
@Override
public Account openAccount() {
System.out.println("打开活期账号");
return null;
}
@Override
public void showAccountType() {
System.out.println("这是一个活期账号");
}
}
定期账户类:
public class DepositAccount implements Account {
@Override
public Account openAccount() {
System.out.println("打开定期账号");
return new DepositAccount();
}
@Override
public void showAccountType() {
System.out.println("这是一个定期账号");
}
}
抽象银行类:
public abstract class Bank {
protected Account account;
public Bank(Account account) {
this.account = account;
}
abstract Account openAccount();
}
中国农业银行类:
public class ABCBank extends Bank {
public ABCBank(Account account) {
super(account);
}
@Override
Account openAccount() {
System.out.println("打开中国农业银行账号");
account.openAccount();
return account;
}
}
中国工商银行类:
public class ICBCBank extends Bank {
public ICBCBank(Account account) {
super(account);
}
@Override
Account openAccount() {
System.out.println("打开中国工商银行账号");
account.openAccount();
return account;
}
}
测试代码:
Bank icbcBank = new ICBCBank(new DepositAccount());
Account icbcAccount = icbcBank.openAccount();
icbcAccount.showAccountType();
Bank abcBank1 = new ICBCBank(new DepositAccount());
Account abcAccount1 = abcBank1.openAccount();
abcAccount1.showAccountType();
Bank abcBank2 = new ICBCBank(new SavingAccount());
Account abcAccount2 = abcBank2.openAccount();
abcAccount2.showAccountType();
测试结果:
UML图如下:
二、外观模式
外观模式又叫门面模式,隐藏了系统的复杂性,并向客户端提供了一个统一的接口,符合迪米特法则即最少知道原则。不符合开闭原则,增加新的服务需要修改外观类。
积分礼物类:
public class PointsGift {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public PointsGift(String name) {
this.name = name;
}
}
校验库存服务:
public class QualifyService {
public boolean isAvailable(PointsGift pointsGift) {
//校验库存
System.out.println("校验 " + pointsGift.getName() + ", 积分资格通过");
return true;
}
}
抵扣积分服务:
public class PointsPaymentService {
public boolean pay(PointsGift pointsGift) {
//扣积分
System.out.println("支付" + pointsGift.getName() + "积分成功");
return true;
}
}
地址服务:
public class ShippingService {
public String shipGift(PointsGift pointsGift) {
//物流系统的对接逻辑
System.out.println(pointsGift.getName() + "进入物流系统");
String shippingOrderNo = "123456";
return shippingOrderNo;
}
}
封装的外观服务类:
public class GiftExchangeService {
private QualifyService qualifyService = new QualifyService();
private PointsPaymentService pointsPaymentService = new PointsPaymentService();
private ShippingService shippingService = new ShippingService();
public void giftExchange(PointsGift pointsGift) {
if (qualifyService.isAvailable(pointsGift)) {
if (pointsPaymentService.pay(pointsGift)) {
String shippingOrderNo = shippingService.shipGift(pointsGift);
System.out.println("生成的订单号为" + shippingOrderNo);
}
}
}
}
测试代码:
GiftExchangeService giftExchangeService = new GiftExchangeService();
giftExchangeService.giftExchange(new PointsGift("蓝牙耳机"));
测试结果:
UML图如下(客户端调用的只是外观类,和隐藏在外观类中的任何服务都没直接关系):
最后
以上就是痴情鞋垫为你收集整理的结构型设计模式---桥接模式和外观模式的全部内容,希望文章能够帮你解决结构型设计模式---桥接模式和外观模式所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复