首页 > 其他分享 >设计模式学习笔记之七大原则

设计模式学习笔记之七大原则

时间:2024-11-16 10:45:21浏览次数:1  
标签:之七大 name chart void draw 笔记 class 设计模式 public

设计模式的七大原则

  • 开闭原则(Open Closed Principle,OCP)
  • 单一职责原则(Single Responsibility Principle, SRP)
  • 里氏代换原则(Liskov Substitution Principle,LSP)
  • 依赖倒转原则(Dependency Inversion Principle,DIP)
  • 接口隔离原则(Interface Segregation Principle,ISP)
  • 合成/聚合复用原则(Composite/Aggregate Reuse Principle,CARP)
  • 最少知识原则(Least Knowledge Principle,LKP)或者迪米特法则(Law of Demeter,LOD)

一、开闭原则

一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。模块应尽量在不修改原(是"原",指原来的代码)代码的情况下进行扩展。

开闭原则的意义

软件需要发生变更的时候,尽量减少变更的范围。
对于BUG修改尽量减小影响范围。对于功能扩展,尽量不影响原来的逻辑。
对于使用这个类的代码逻辑,也不要轻易动它。

JAVA中的接口/抽象类与实现类、扩展类之间的关系体现了这一原则。
具体实现都放在实现类或者子类里面,这样需要扩展的时候,多定义一个实现类就可以了,而不用改变原来的逻辑。
接口/抽象类体现了对修改关闭,使用者只能关心接口中定义的方法。这就对接口定义有了更高的要求。不能轻易去动它。

public class BarChart {

	public void draw(){
		System.out.println("Draw bar chart...");
	}
}

public class LineChart {

	public void draw(){
		System.out.println("Draw line chart...");
	}
}

public class App {

	public void drawChart(String type){
		if (type.equalsIgnoreCase("line")){
			new LineChart().draw();
		}else if (type.equalsIgnoreCase("bar")){
			new BarChart().draw();
		}
	}
}

修改后

public abstract class AbstractChart {

	public abstract void draw();
}

public class BarChart extends AbstractChart{

	@Override
	public void draw() {
		System.out.println("Draw bar chart...");
	}
}

public class LineChart extends AbstractChart {

	@Override
	public void draw() {
		System.out.println("Draw line chart...");
	}
}

public class App {
    /// 如果再扩展一个Chart,这部分的逻辑是完全不用动的。
    /// 但是生成AbstractChart chart的逻辑,要同步扩展,这就可能要用到工厂模式。
	public void drawChart(AbstractChart chart){
		chart.draw();
	}
}

二、单一职责原则

一个类或者模块应该有且只有一个改变的原因。如果一个类承担的职责过多,就等于把这些职责耦合在一起了。
一个类不能做太多的东西。在软件系统中,一个类(一个模块、或者一个方法)承担的职责越多,那么其被复用的可能性就会越低。
其实有的时候很难去衡量一个类的职责,主要是很难确定职责的粒度。这一点不仅仅体现在一个类或者一个模块中,也体现在采用微服务的分布式系统中。这也就是为什么我们在实施微服务拆分的时候经常会撕逼:"这个功能不应该发在A服务中,它不做这个领域的东西,应该放在B服务中"诸如此类的争论。存在争论是合理的,不过最好不要不了了之,而应该按照领域定义好每个服务的职责(职责的粒度最好找业务和架构专家咨询),得出相对合理的职责分配。
例:

public class Service {
	///S ervice做了太多东西,包括数据库连接的管理,
    ///Sql的执行这些业务层不应该接触到的逻辑,更可怕的是,例如到时候如果数据库换成了Oracle,这个方法将会大改。
	public UserDTO findUser(String name){
		Connection connection = getConnection();
		PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM t_user WHERE name = ?");
		preparedStatement.setObject(1, name);
        User user = //处理结果
        UserDTO dto = new UserDTO();
        //entity值拷贝到dto
        return dto;
	}
}

修改后:

public class Service {

    private Dao dao;
	
	public UserDTO findUser(String name){
       User user =  dao.findUserByName(name);
       UserDTO dto = new UserDTO();
        //entity值拷贝到dto
       return dto;
    }
}


public class Dao{

    public User findUserByName(String name){
       Connection connection = DataBaseUtils.getConnnection();
       PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM t_user WHERE name = ?");
		preparedStatement.setObject(1, name);
        User user = //处理结果
        return user;
    }
}

可以反过来思考,我们这段逻辑里,哪些逻辑是可能被复现,主要的逻辑链条是核心的。
以此为标准去思考设计是否合理

标签:之七大,name,chart,void,draw,笔记,class,设计模式,public
From: https://www.cnblogs.com/zhimo8901/p/18549129

相关文章

  • 人工智能:原理与技术 学习笔记
    Lecture2Supervisedlearning:regression,classification,...Unsupervisedlearning:clustering,dimensionalityreduction,...Thecanonicalmachinelearningproblem:Givenasetoftrainingdata\(\{(x_i,y_i)\}_{i=1}^m\)andalossfunction\......
  • [笔记]Dijkstra算法正确性证明
    最近做了一些题,感觉对算法更深刻的理解是比套板子更深层次的,在这个层次上解决问题,思路会更加清晰。比如P5687[CSP-S2019江西]网格图(题解)这道题就是网格图的最小生成树,解法就建立在普通Kruskal的基础上,当时想了挺久也没想出来,看了题解才豁然开朗。所以各算法总是要回顾回顾的~......
  • The Missing Semester 第一讲MIT笔记
    幕布链接shell命令-幕布echo打印传入参数echohello\Worldecho"helloworld"echo$PATH(找环境变量在哪)date查看时间which查看程序所在的目录pwdpresentworkingdirectory当前所在的工作目录path在windows中路径一般为反斜杠\masOS和Linux不同为斜杠,下为绝对路径......
  • c语言笔记(鹏哥)课件+上课板书汇总(深入指针1)
    深入指针(1)⽬录:一、内存和地址二、指针变量和地址三、取地址操作符四、指针变量类型的意义(这一讲到这)五、const修饰指针六、指针运算七、野指针八、assert断⾔九、指针的使⽤和传址调⽤内存和地址引例:假设有一个宿舍楼,你在一个房间里,宿舍楼里每一间房间都......
  • 斜率优化学习笔记
    例题:薯片小明现在体重\(W\)公斤,减肥将会持续\(n\)天。第\(i\)天如果不吃薯片体重将会减少\(A\)公斤,吃了体重会增加\(D_i\)公斤。但是不吃薯片实在是很难受,这个难受情况用压力值来描述。一开始压力值为\(0\),每一天不吃薯片压力值将会增加\(1\),吃了薯片压力值又会变回......
  • 【跟着阿舜学音乐-笔记】1.11和弦的表现形式
    和弦的分配在音乐演奏中,和弦会有纵向和横向两种分配形式。和弦最低的音铺垫了整体和弦宏观色彩与基调,一般词用和弦的根音,但并不一定。同时最低的音通常要与上方的音有一定距离,一般是大于等于五度,具体也和音区有关。所谓和声铺底,就是铺设主要和弦音的区域,一般采取1~2件乐器。......
  • C语言经典100题 学习笔记(更新中)
    第一题:有1、2、3、4四个数字,能组成多少互不相同且无重复数字的三位数?都是多少?#include<stdio.h>//有1、2、3、4四个数字//能组成多少互不相同且无重复数字的三位数?都是多少?intmain01(){ inta=0; intb=0; intc=0; intcount=0; for(a=1;a<5;a++) {......
  • 【Python学习笔记】 第10章 Python语句简介
    重温Python的知识结构程序由模块组成。模块包含语句。语句包含表达式。表达式创建并处理对象。从基础上看,Python编写的程序实际上时由语句和表达式构成的。表达式用于处理对象,并被嵌入到语句中。语句使用并引导表达式处理我们前几章所学的对象。语句可以创建对象。Python......
  • 若依笔记(十一):芋道多租户限制与修改
    目录多租户实现哪些表是多租户的?YudaoTenant自动装载类租户隔离的sql在哪?如何修改成无租户隔离全局修改表级别请求RUL级别芋道比若依多了租户概念,这也是因为它增加很多业务系统,首先后台管理系统肯定是多租户的,这意味着如商城系统的产品管理SPU、库存管理SKU都可以是......
  • 代理模式在JavaScript中的恋爱应用笔记
    一、引言在面向对象编程的世界里,代理模式犹如一位巧妙的媒人,巧妙地连接了两个对象之间的交互,而无需直接显式地引用彼此。这种模式不仅降低了系统的耦合度,还使得代码更加灵活、可扩展。而在JavaScript的世界里,代理模式更是展现出了其独特的魅力。今天,我将结合恋爱场景,为大家......