作用
将抽象部分与它的具体实现部分分离,使他们都可以独立的变化
通过组合的方式创建两个类之间的联系,而不是继承
对抽象事物进一步化的产物
抽象和具体实现之间增加更多的灵活性,可以排列组合了
Demo设计
以不同银行的不同账号为例
账号类型有很多,比如活期、定期
银行也有很多种,比如农行,工行
实现银行与账号类型之间的排列组合,比如农行的活期卡
账号接口
public interface Account {/*** 开启账号** @return*/Account openAccount();/*** 账号类型*/void showAccountType();}
实现类
定期账号
public class DepositAccount implements Account {@Overridepublic Account openAccount() {return new DepositAccount();}@Overridepublic void showAccountType() {System.out.println("这是一个定期账号");}}
活期账号
public class SavingAccount implements Account {@Overridepublic Account openAccount() {return new SavingAccount();}@Overridepublic void showAccountType() {System.out.println("活期账号");}}
银行类
先定义一个抽象类,通过子类继承来实现具体的银行的账户信息
在银行类中注入实现账户接口的对象
public abstract class Bank {private Account account;public Bank(Account account) {this.account = account;}public Account getAccount() {return account;}protected abstract Account openAccount();}
子类
工商行
public class ICBCBank extends Bank {public ICBCBank(Account account) {super(account);}@Overrideprotected Account openAccount() {System.out.println("中国工商银行账号开户");return super.getAccount();}}
农行
public class ABCBank extends Bank {public ABCBank(Account account) {super(account);}@Overrideprotected Account openAccount() {System.out.println("中国农业银行账号开户");return super.getAccount();}}
使用
new银行对象时可通过注入的方式,使得不同银行和不同账号实现排列组合
public static void main(String[] args) {Bank icbcBank = new ICBCBank(new DepositAccount());Account icbcAccount = icbcBank.openAccount();icbcAccount.showAccountType();Bank abcBank = new ICBCBank(new SavingAccount());Account abcAccount = abcBank.openAccount();abcAccount.showAccountType();}
小结
通过组合的方式使多个类配合工作,和适配器模式有点像
具体区别是适配器模式是配合使用已有的接口
桥接是分离抽象和具体的实现
