桥接模式使用时需要先明确下列代码例子的用户类型和充值方式
复制粘贴代码执行一遍会比较清楚
/**
* 一个充值功能,有用户类型(普通用户和vip用户给)充值和充值方式(银行充值和微信充值)
* 正常情况。如果添加一种用户类型或充值方式需要添加多个类
* 桥接模式解决:
* 1.将用户类型当做接口,vip,普通用户实现这个接口
* 2.将充值方式当抽象类,里面的属性包含了用户类型,且实现了充值功能,实际功能由用户类型实现类去实现
*/
public class ClientTopUp {
public static void main(String[] args) {
VipUser vipUser = new VipUser();
TopUp vipTopUp = new BankTopUp(vipUser);
System.out.println(vipTopUp.transferMoney(100));
System.out.println("=================");
NormalUser normalUser = new NormalUser();
TopUp normalTopUp = new WeixinTopUp(normalUser);
System.out.println(normalTopUp.transferMoney(100));
}
}
abstract class TopUp {
UserType userType;
public TopUp(UserType userType) {
this.userType = userType;
}
public double transferMoney(double money) {
return userType.transferMoney(money);
}
}
class WeixinTopUp extends TopUp {
public WeixinTopUp(UserType userType) {
super(userType);
}
public double transferMoney(double money) {
System.out.println("使用微信充值,不送钱");
return userType.transferMoney(money);
}
}
class BankTopUp extends TopUp {
public BankTopUp(UserType userType) {
super(userType);
}
public double transferMoney(double money) {
System.out.println("银行卡充值送5元");
money = userType.transferMoney(money);
money += 5;
return money;
}
}
interface UserType {
public double transferMoney(double money);
}
class NormalUser implements UserType {
@Override
public double transferMoney(double money) {
System.out.println("普通用户充值没有优惠");
return money;
}
}
class VipUser implements UserType {
@Override
public double transferMoney(double money) {
double newMoney = money * 1.5;
System.out.println("vip用户充钱送50%,原充值" + money + "元,实际充值" + newMoney + "元");
return newMoney;
}
}
// 如果没有不同的付款方式,也可以直接用这个对象
/*class TopUp {
UserType userType;
public TopUp(UserType userType) {
this.userType = userType;
}
public double transferMoney(double money) {
return userType.transferMoney(money);
}
}*/