这几天写代码 由于逻辑计算量颇大而且情况很多 导致就会出现了很多if else的语句
然后我又有强迫症贼贼不喜欢代码中出现很多if else 绕圈圈 感觉很不雅观 于是就研究了使用享元设计模式加策略模式使用解决了这个问题,
现在重新弄了个demo和大家分享一波。
1.享元模式介绍
享元模式: 运用共享技术有效地支持大量细粒度的对象,常用于系统底层开发,解决系统的性能问题。
比如:数据库连接池,里面都是已经创建好了的对象供我们使用,我们有使用的就可以直接去拿,没有的话就会创建一个连接对象,避免重复的创建对象使用
享元模式能够解决重复对象的内存浪费的问题,当系统中有大量相似对象,需要缓冲池时。不需总是创建新对象,可以从缓冲池里拿。这样可以降低系统内存,同时提高效率
应用场景:String 常量池、数据库连接池、缓冲池等等都是享元模式的应用,享元模式是池技术的重要实现方式
其实和缓存的概念模型是很像的 但细分的话 享元模式又可以细粒化对象,抽离内部和外部状态来做共享,减少对象,节省内存空间
1.使用情况
1.代码中出现大量相似的对象:假如系统代码中出现大量相似的对象,但是这些对象的内部状态又很多相同可以达到共享时,可以通过共享内部状态来达到减少对象的创建从而节省内存的开销,提高系统的性能
2.对象的创建的开销比较大:假如代码中出现大量的创建对象且这些对象内部可以作为共享的时候就可以考虑使用享元设计模式减少对象的创建做内部状态共享来提高系统的性能。
3.内部和外部的状态分离:当对象有内部和外部两种不同的状态,但是内部状态不变,外部状态变化的话,可以使用享元设计模式将内部状态共享,在不同的外部状态下使用内部共享,可以避免对象过多的创建,从而提高系统的性能
4.缓存和对象池:当需要对对象进行缓存或维护对象池时,可以使用享元模式。它提供了一个集中管理对象的机制,可以有效地创建、共享和重用对象,以减少创建和销毁对象的开销。
总而言之 就是享元模式的优点就是有效的减少系统中对象的创建,提高系统的性能也可以解决代码很多if else的烦恼,但是需要维护共享区域增加额外的开销。
首先第一步
2.定义一个策略转接头
/**
* @Author: mark
* @Description: 定义策略转接头
* @Date: 2023/05/30/13:44
* @Version: 1.0
*/
public interface TestStrategy {
//定义一个抽象的策略接口
void testStrategyDemo();
}
分别编写了3中策略如下:
/**
* @Author: mark
* @Description: 策略转接情景1
* @Date: 2023/05/30/13:46
* @Version: 1.0
*/
public class Test1StrategyImpl implements TestStrategy {
@Override
public void testStrategyDemo() {
System.out.println("全体进攻中路!");
}
}
/**
* @Author: mark
* @Description: 策略转接情景2
* @Date: 2023/05/30/13:46
* @Version: 1.0
*/
public class Test2StrategyImpl implements TestStrategy {
@Override
public void testStrategyDemo() {
System.out.println("猥琐发育别浪!");
}
}
/**
* @Author: mark
* @Description: 策略转接情景3
* @Date: 2023/05/30/13:46
* @Version: 1.0
*/
public class Test3StrategyImpl implements TestStrategy {
@Override
public void testStrategyDemo() {
System.out.println("131分带破水晶!");
}
}
3.服务策略提供工厂
有了这些策略后还得有个工厂帮咱们做一些准备工作以及执行咱们的各种方针作为咱们的服务提供方 咱们只是作为消费者就行了
/**
* @Author mark
* @Description 服务策略提供工厂
* @Date 2023/05/20/14:54
* @Version 1.0
*/
@Component
public class TsetStragetyFactory {
private TestStrategy testStrategy;
//set具体的策略
public void setStrategy(TestStrategy testStrategy) {
this.testStrategy = testStrategy;
}
//执行set之后的策略
public void startStrategy(){
testStrategy.testStrategyDemo();
}
}
4. 最后咱们就验证一下
public static void main(String[] args) {
//创建工厂对象
TsetStragetyFactory tsetStragetyFactory = new TsetStragetyFactory();
//提供策略1
tsetStragetyFactory.setStrategy(new Test1StrategyImpl());
//执行策略1
tsetStragetyFactory.startStrategy();
//提供策略2
tsetStragetyFactory.setStrategy(new Test2StrategyImpl());
//执行策略2
tsetStragetyFactory.startStrategy();
//提供策略3
tsetStragetyFactory.setStrategy(new Test3StrategyImpl());
//执行策略3
tsetStragetyFactory.startStrategy();
//只需提供策略就可以执行不同的策略.......
}
结果如图所示
只需提供策略就可以执行不同的策略啦