桥接模式

This commit is contained in:
2020-02-29 14:42:38 +08:00
parent 4bef4dc45b
commit f54b3fd1b1
7 changed files with 195 additions and 0 deletions

View File

@@ -0,0 +1,22 @@
package top.fjy8018.designpattern.pattern.structural.bridge;
/**
* 银行账号——行为接口
*
* @author F嘉阳
* @date 2020/2/29 9:55
*/
public interface Account {
/**
* 打开一个账号
*
* @return
*/
Account openAccount();
/**
* 查看账号类型
*/
void showAccountType();
}

View File

@@ -0,0 +1,26 @@
package top.fjy8018.designpattern.pattern.structural.bridge;
import lombok.AllArgsConstructor;
/**
* 抽象银行
* 组合账户接口,交由子类实现具体的行为
*
* @author F嘉阳
* @date 2020/2/29 10:05
*/
@AllArgsConstructor
public abstract class Bank {
protected Account account;
/**
* 打开一个账户
* 该方法定义与接口相同,方法名称可以不同
* 当前抽象类的openAccount方法需要委托给Account接口openAccount方法实现
* 当前类为抽象类,委托给接口的实现类执行,体现抽象与实现分离
*
* @return
*/
abstract Account openAccount();
}

View File

@@ -0,0 +1,31 @@
package top.fjy8018.designpattern.pattern.structural.bridge;
import lombok.extern.slf4j.Slf4j;
/**
* 定期账户
*
* @author F嘉阳
* @date 2020/2/29 9:57
*/
@Slf4j
public class DepositAccount implements Account {
/**
* 打开一个账号
*
* @return
*/
@Override
public Account openAccount() {
log.info("打开定期账户");
return new DepositAccount();
}
/**
* 查看账号类型
*/
@Override
public void showAccountType() {
log.info("这是一个定期账户");
}
}

View File

@@ -0,0 +1,31 @@
package top.fjy8018.designpattern.pattern.structural.bridge;
import lombok.extern.slf4j.Slf4j;
/**
* @author F嘉阳
* @date 2020/2/29 10:09
*/
@Slf4j
public class GCBBank extends Bank {
public GCBBank(Account account) {
super(account);
}
/**
* 打开一个账户
* 该方法定义与接口相同,方法名称可以不同
* 当前抽象类的openAccount方法需要委托给Account接口openAccount方法实现
* 当前类为抽象类,委托给接口的实现类执行,体现抽象与实现分离
*
* @return
*/
@Override
Account openAccount() {
log.info("打开广州银行账户");
// 委托
account.openAccount();
return account;
}
}

View File

@@ -0,0 +1,31 @@
package top.fjy8018.designpattern.pattern.structural.bridge;
import lombok.extern.slf4j.Slf4j;
/**
* @author F嘉阳
* @date 2020/2/29 10:11
*/
@Slf4j
public class ICBCBank extends Bank {
public ICBCBank(Account account) {
super(account);
}
/**
* 打开一个账户
* 该方法定义与接口相同,方法名称可以不同
* 当前抽象类的openAccount方法需要委托给Account接口openAccount方法实现
* 当前类为抽象类,委托给接口的实现类执行,体现抽象与实现分离
*
* @return
*/
@Override
Account openAccount() {
log.info("打开工商银行账户");
// 委托
account.openAccount();
return account;
}
}

View File

@@ -0,0 +1,31 @@
package top.fjy8018.designpattern.pattern.structural.bridge;
import lombok.extern.slf4j.Slf4j;
/**
* 活期账户
*
* @author F嘉阳
* @date 2020/2/29 9:58
*/
@Slf4j
public class SavingAccount implements Account {
/**
* 打开一个账号
*
* @return
*/
@Override
public Account openAccount() {
log.info("打开活期账户");
return new SavingAccount();
}
/**
* 查看账号类型
*/
@Override
public void showAccountType() {
log.info("这是一个活期账户");
}
}

View File

@@ -0,0 +1,23 @@
package top.fjy8018.designpattern.pattern.structural.bridge;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
/**
* @author F嘉阳
* @date 2020/2/29 14:30
*/
@Slf4j
class AccountTest {
@Test
void openAccount() {
Bank gcbBank = new GCBBank(new DepositAccount());
Account gcbAccount = gcbBank.openAccount();
gcbAccount.showAccountType();
Bank icbcBank = new ICBCBank(new SavingAccount());
Account icbcAccount = icbcBank.openAccount();
icbcAccount.showAccountType();
}
}