1.设计模式中策略模式是什么?
策略模式你可以理解成:一类事情有多种做法,把每种做法单独封装起来,运行时按条件选择一种。 比如支付有支付宝、微信、银行卡;或者优惠计算有满减、打折、返现。 它的好处是把一堆 if-else 拆开了,扩展新策略时不容易改乱原有代码。 一句话就是:同一类问题,多种算法,按场景切换。
策略模式
该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。
角色:
抽象策略类:这是一个抽象角色,通常由一个接口或抽象类实现。此角色给出所有的具体策略类所需的接口。 具体策略类:实现了抽象策略定义的接口,提供具体的算法实现或行为。 环境类:持有一个策略类的引用,最终给客户端调用。
java
interface Strategy {
void show();
}java
class StrategyA implements Strategy {
public void show() {
System.out.println("买一送一");
}
}java
class StrategyB implements Strategy {
public void show() {
System.out.println("满200元减50元");
}
}java
class StrategyC implements Strategy {
public void show() {
System.out.println("满1000元加一元换购任意200元以下商品");
}
}Java
class Mall {
private Strategy strategy;
public void setStrategy(Strategy strategy) {
this.strategy = strategy;
}
public void mallShow() {
strategy.show();
}
}java
public static void main(String[] args) {
Mall mall = new Mall();
mall.setStrategy(new StrategyA());
mall.mallShow();
mall.setStrategy(new StrategyB());
mall.mallShow();
mall.setStrategy(new StrategyC());
mall.mallShow();
}你可以把这段代码理解成:
- Strategy:优惠活动的统一规则接口
- StrategyA、StrategyB、StrategyC:三种不同的促销方案
- Mall:商场,它不亲自决定优惠怎么算,而是“拿一个具体策略来执行”
核心思想就一句话:
把“怎么做”抽出来,变成可替换的对象。
比如商场做活动:
- 今天搞“买一送一”
- 明天搞“满200减50”
- 后天搞“满1000加1元换购”
如果不用策略模式,你大概率会写成一堆 if...else:
java
if (type == 1) {
System.out.println("买一送一");
} else if (type == 2) {
System.out.println("满200元减50元");
} else if (type == 3) {
System.out.println("满1000元加一元换购任意200元以下商品");
}这样的问题是:
- 新增一种活动,就要改原来的判断代码
- 活动越多,if...else 越长
- 代码越来越难维护
2.三种工厂模式?
常见就是简单工厂、工厂方法、抽象工厂。 简单工厂是一个工厂里统一创建不同产品;工厂方法是每种产品对应一个工厂;抽象工厂是创建一整套有关联的产品族。 线下面试不用展开太复杂,抓住一句:从简单工厂到抽象工厂,本质上是创建逻辑越来越解耦,扩展性越来越强。