专栏首页mySoul设计模式 开闭原则
原创

设计模式 开闭原则

设计模式 - 开闭原则

即 对立与统一原则

什么是开闭原则

软件实体应该对扩展开放,对修改关闭,即实体应当通过扩展实现变化,而不是修改代码实现变化

什么是软件实体,项目或软件中按照一定逻辑规划划分的模块 抽象 类 方法

书店销售书籍

然后书写代码如下

// 书籍接口
public interface Ibook{
	// 名称
	public String getName();
	// 售价
	public int getPrice();
	// 作者
	public String getAuthor();
}

书店出售小说类书籍,书写代码

public class NoveIBook implements IBook {
	// 名称
	private String name;
	// 价格
	private int price;
	// 作者
	private String author;
	// 构造函数
	public NoveIBook(String _name, int _price, String _author){
		this.name = _name;
		this.price = _price;
		this.author = _author;
	}
	// 获得作者
	public String getAuthor(){
		return this.author;
	}
	// 价格
	public String getPrice(){
		return this.price;
	}
	// 名字
	public String getName(){
		return this.name;
	}
}

其中,价格定义为int,不是错误,非金融类项目,取两位精度,运算过程中,扩大100倍,展示时缩小100倍。

售书

public class BookStore {
	private final static ArrayList bookList = new ArrayList();
	// 下发的内容,是放置在持久层,即保存到硬盘中的
	// java的三层架构为视图层,服务层,持久层。
	// view 层 用于接收用户提交的请求代码
	// service 系统的业务逻辑
	// dao 持久层,操作数据库代码
	// 上下层,通过接口联系
	static{
		bookList.add(new NoveIBook("", 3200, ""));
	}
	// 买书
	public static void main(String[] args){
		// 大数格式化
		NumberFormat formatter = NumberFormat.getCurrencyInstance();
		formatter.setMaximumFractionDigits(2);
		for(IBook book:bookList){
			System.out.println(book.getName() + book.getPrice() + book.getAuthor());
		}
	}
}

然后,发生打折。

修改接口

接口不应该修改,因为接口是持久的

修改实现类

修改getPrice()方法达到打折的目的。

但是,因为采购书籍的人,要看到实现的价格。所以不修改

扩展实现

再增加一个子类,如下

代码如下

// 打折销售的小说
public class OffNovelBook extends NoveIBook {
	public OffNoveIBook(String _name, int _price, String _author){
		super(_name, _price, _author);
	}
	// 覆盖销售
	@Override
	public int getPrice(){
		return super.getPrice()*90 / 100;
	}
}

接着修改main里面的内容即可。

变化

变化分为逻辑变化,子模块变化,可见视图变化。

使用开闭原则

抽象约束

抽象约束对一组事物的描述。

当商店增加了一个计算机书籍的销售。但是计算机书籍还有很多种,有编程语言,数据库等。

// 增加计算机书籍接口
public interface IComputerBook extends IBook{
	// 计算机书籍
	public String getScope();	// 计算机书籍的范围
}

同样的,书写计算机书籍类

public class ComputerBook implements IComputerBook{
	private String name;
	private String scope;
	private String author;
	public ComputerBook(String _name, int _price, String _author, String _scope){
		this.name = _name;
		this.price = _price;
		this.author = _author;
		this.scope = _scope;
	}
	public String getScope(){
		return this.scope;
	}
	public String getName(){
		return this.name;
	} 
	public int getPrice(){
		return this.price;
	}
}

直接在main中添加即可。

总结 ; 对扩展开放,前提对抽象约束。

元数据控制模块

即,使用配置参数,控制模块行为。

原则总结

单一职责

类的职责要单一

里氏替换

里氏替换原则不能破坏继承

即,子类对象,可以代替超类。

依赖倒置

面向接口。

即,每个接口只负责干一件事。

接口隔离

每个接口只干一件事

迪米特法则

通信通过类之间通信。两者之间耦合度越少越好。

开闭原则

对扩展开放,对修改关闭

www.iming.info

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 设计模式-原型模式

    关于Cloneable 接口,用途和Serializable一样为标记型接口,内部没有方法和属性,implements Cloneable 表示对象能被克隆,即...

    mySoul
  • 代理模式

    mySoul
  • DAO 设计模式

    客户发送数据到显示层,显示层发送数据到业务层,业务发送数据到数据层,数据层进行持久化.即.保存进入databases

    mySoul
  • java中的排序(自定义数据排序)--使用Collections的sort方法

        当引用类型的内置排序方式无法满足需求时可以自己实现满足既定要求的排序,有两种方式:

    wfaceboss
  • 学习SpringMVC——说说视图解析器

      各位前排的,后排的,都不要走,咱趁热打铁,就这一股劲我们今天来说说spring mvc的视图解析器(不要抢,都有位子~~~)   相信大家在昨天那篇如何获取...

    JackieZheng
  • Java知识点——方法引用

    用户7073689
  • 设计模式之备忘录模式(行为型)

    备忘录模式(Memento Pattern):备忘录模式的定义是在不破坏封装的前提下,捕获一个对象的内部状态,并将该对象之外保存这个状态,这样可以在以后将对象恢...

    SmileNicky
  • Java自动化测试(登陆接口测试 14)

    zx钟
  • Retrofit网络请求库应用02——json解析

    PS:上一篇写了Retrofit网络请求库的简单使用,仅仅是获取百度的源码,来证明连接成功,这篇讲解如何解析JSON数据,该框架不再是我们之前自己写的那样用Js...

    cMusketeer
  • 聊聊spring cloud的ConsulAutoConfiguration

    本文主要研究一下spring cloud的ConsulAutoConfiguration

    codecraft

扫码关注云+社区

领取腾讯云代金券