Java设计模式—面向对象设计原则(一) ----->开闭原则OCP(完整详解,附有代码+案例)

3.1开闭原则

对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类

如下,分析搜狗输入法皮肤设计:

分析:搜狗输入法的皮肤是输入法背景图片、窗口颜色和声音等元素的组合。用户可以根绝自己的喜爱更换不同的输入法皮肤,也可以从网上下载新的皮肤。这些皮肤有共同的特点,可以将这些共同的的特点抽取到一个抽象类(AbstractSkin)中,而每个具体的皮肤(DefaultSkin、MySkin)是其子类。用户可以根据需要选择或者增加新的主题,而不需要修改原代码。

java 复制代码
// 抽象类
public abstract class AbstractSkin {
    public abstract void displaySkin();
}
=========================================================
 //实现类
  public class DefaultSkin extends AbstractSkin{
    @Override
    public void displaySkin() {
        System.out.println("这是默认皮肤...");
    }
}
=========================================================
 //实现类
  public class MySkin extends AbstractSkin{

    @Override
    public void displaySkin() {
        System.out.println("这是自己的皮肤...");
    }
}
=========================================================
  /**
 * 实现聚合的类
 */
public class SouGouInput {
    //成员变量是AbstractSkin类型,(实现聚合)
    private AbstractSkin skin;

    public void setSkin(AbstractSkin skin) {
        this.skin = skin;
    }
		//普通方法
    public void display(){
       //根据设置(setXxx)的成员变量的不同,来调用不同成员变量的皮肤
       //这里的成员变量类型是抽象类型,
       //所以是根据传递不同实现类的对象而调用不同的实现类里重写后的方法来显示不同的皮肤
       skin.displaySkin();
    }
}
=========================================================
//测试类
  public class ClinentTest {
    public static void main(String[] args) {

        //1. 创建搜狗输入法对象,将各种皮肤聚合到一起
        SouGouInput sgi = new SouGouInput();

        // 2.创建皮肤对象
        //2.1 常规
        // DefaultSkin ds = new DefaultSkin();
        // 2.2多态
        AbstractSkin ds = new DefaultSkin();
        MySkin ms = new MySkin();
        // 3.将皮肤设置到输入法中
        sgi.setSkin(ds);
        // sgi.setSkin(ms);


        // 4.显示皮肤
        sgi.display();//这是默认皮肤...
   
   


//当有新的输入法皮肤时候,只需重新创建一个皮肤类去继承抽象类,
//然后重写里面的抽象方法,再在测试类中添加即可。而不用修改之前的代码
    }
}
相关推荐
ZouZou老师2 小时前
C++设计模式之装饰器模式:以家具生产为例
c++·设计模式·装饰器模式
HerayChen2 小时前
HbuilderX 内存溢出报错
java·大数据·linux
ZouZou老师2 小时前
C++设计模式之桥接模式:以家具生产为例
c++·设计模式·桥接模式
程序员小白条2 小时前
0经验如何找实习?
java·开发语言·数据结构·数据库·链表
小马爱打代码2 小时前
Spring AI:搭建自定义 MCP Server:获取 QQ 信息
java·人工智能·spring
郭涤生2 小时前
QT 架构笔记
java·数据库·系统架构
韩立学长2 小时前
基于Springboot流浪动物领养网站0kh2iyb4(程序、源码、数据库、调试部署方案及开发环境)系统界面展示及获取方式置于文档末尾,可供参考。
数据库·spring boot·后端
daidaidaiyu2 小时前
基于LangGraph开发复杂智能体学习一则
java·ai
ZouZou老师2 小时前
C++设计模式之组合模式:以家具生产为例
c++·设计模式·组合模式
Moment3 小时前
从美团全栈化看 AI 冲击:前端转全栈,是自救还是必然 🤔🤔🤔
前端·后端·面试