热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

软件设计原则java

1.开闭原则(Open-ClosedPrinciple,OCP)开闭原则是指对扩展开放,对修改开闭,提高软件系统的可复用性及可维护性,是面向对象的最基础设计原则。Softwaree

1.开闭原则(Open-Closed Principle,OCP)

开闭原则是指对扩展开放,对修改开闭,提高软件系统的可复用性及可维护性,是面向对象的最基础设计原则。

Software entities like classes,modules and functions shoud be open for extension but closed for modifications.

 


/*
* Copyright (c) 2020 liuhy
* 项目名称:softwareDesignPrinciple
* 文件名称:bread.java
* 创建日期:2020/5/23 下午6:41
* 作者:liuhy
*/
package com.liuhy.sdp.ocp;
/**
* Created on 2020/5/23.
*
* @author haiyu Liu
*/
public class bread implements commodity{
private Integer fid;
private String name;
private float price;
public bread(Integer fid, String name, float price) {
this.fid = fid;
this.name = name;
this.price = price;
}
public Integer getFid() {
return this.fid;
}
public String getName() {
return this.name;
}
public float getPrice() {
return this.price;
}
//
}
/*
* Copyright (c) 2020 liuhy
* 项目名称:softwareDesignPrinciple
* 文件名称:breadDiscount.java
* 创建日期:2020/5/23 下午6:44
* 作者:liuhy
*/
package com.liuhy.sdp.ocp;
/**
* Created on 2020/5/23.
*
* @author haiyu Liu
*/
public class breadDiscount extends bread {
public breadDiscount(Integer fid, String name, float price) {
super(fid, name, price);
}
public float getDiscountPrice(){
return super.getPrice()*0.9F;
}
}
/*
* Copyright (c) 2020 liuhy
* 项目名称:softwareDesignPrinciple
* 文件名称:commodity.java
* 创建日期:2020/5/23 下午6:16
* 作者:liuhy
*/
package com.liuhy.sdp.ocp;
/**
* Created on 2020/5/23.
*
* @author haiyu Liu
*/
interface commodity {
Integer getFid();
String getName();
float getPrice();
}

 技术分享图片


2.里氏替换原则(Liskov Substitution Principle,LSP)

里氏替换原则就是子类可以扩展父类的功能,但不能够改变父类原有的功能。调用父类的功能,替换成子类也一定能够完成。

Inheritance should ensure that any property proved about supertype objects also holds for subtype objects.


package com.liuhy.sdp.lsp;
/**
* Created on 2020/5/30.
*
*
@author haiyu Liu
*/
public class FatherClass {
public void doWork(){
System.out.println(
"老爹做编码工作");
}
}
package com.liuhy.sdp.lsp;
/**
* Created on 2020/5/30.
*
*
@author haiyu Liu
*/
public class SonClass extends FatherClass{
//做为儿子,你不应该把父亲的实现方法重写,不符合,使用父亲的地方,都能够用子类去替换。
// public void doWork(){
// System.out.println("儿子学习小学语文");
// }
public void doStudyWork(){
System.out.println(
"儿子学习小学语文");
}
}
/**
* Created on 2020/5/23.
*
*
@author haiyu Liu
*/
public class test {
public static void main(String[] args) {
//看看是不是好儿子
//不是好儿子,虽然你帮助了你的爹,但是想让你爸爸做事儿啊,写代码啊
// SonClass son=new SonClass();
// son.doWork();
// son.doStudyWork();
//这个儿子好,没有帮倒忙。
SonClass son1=new SonClass();
son1.doWork();
son1.doStudyWork();
}
}


技术分享图片


3.单一职责原则(Simple Responsibility Principle,SRP)

单一职责原则是指一个类有且仅有一个引起这个类变化的原因。

There should never be more than one reason for a class to change


/**
* Created on 2020/5/30.
*
*
@author haiyu Liu
*/
public class Pay {
//在这个方法中,写入了三种支持方式,当一个改变时,可能影响另外一下,实现的代码职责也有可能不同。
public void forPay(String paytype){
if("wxpay".equals(paytype)){
System.out.println(
"欢迎使用微信支付");
}
else if("alipay".equals(paytype)){
System.out.println(
"欢迎使用支付宝支付");
}
else{
System.out.println(
"欢迎银联支付");
}
}
}
package com.liuhy.sdp.srp;
/**
* Created on 2020/5/30.
*
*
@author haiyu Liu
*/
public class AliPay {
public void forPay(){
System.out.println(
"欢迎使用支付宝支付");
}
}
package com.liuhy.sdp.srp;
/**
* Created on 2020/5/30.
*
*
@author haiyu Liu
*/
public class UnionPay {
public void forPay(){
System.out.println(
"欢迎银联支付");
}
}
package com.liuhy.sdp.srp;
/**
* Created on 2020/5/30.
*
*
@author haiyu Liu
*/
public class WechatPay {
public void forPay(){
System.out.println(
"欢迎使用微信支付");
}
}
package com.liuhy.sdp.srp;
/**
* Created on 2020/5/30.
*
*
@author haiyu Liu
*/
public class test {
public static void main(String[] args) {
//在这个类中实现了多种支付试,不利于代码的维护
Pay pay=new Pay();
pay.forPay(
"wxpay");
//因此对支付方式,创建不同的类,实现不同的支付
//当然可以做一些顶层的接口设计
WechatPay wxpay=new WechatPay();
wxpay.forPay();
AliPay aliPay
=new AliPay();
aliPay.forPay();
UnionPay unionPay
=new UnionPay();
unionPay.forPay();
}
}


技术分享图片


4.依赖倒置原则(Dependence Inversion Principle,DIP)

依赖倒置原则是指抽象不应该依赖具体,具体应该依赖抽象

High level modules shouldnot depend upon low level modules.Both should depend upon abstractions.Abstractions should not depend upon details. Details should depend upon abstractions.


package com.liuhy.sdp.dip;
/**
* Created on 2020/5/30.
*
*
@author haiyu Liu
*/
public class CStudy implements IStudy{
@Override
public void study() {
System.out.println(
"liuhy学习C");
}
}
package com.liuhy.sdp.dip;
/**
* Created on 2020/5/30.
*
*
@author haiyu Liu
*/
public class GoStudy implements IStudy {
@Override
public void study() {
System.out.println(
"liuhy学习GO");
}
}
package com.liuhy.sdp.dip;
/**
* Created on 2020/5/30.
*
*
@author haiyu Liu
*/
public class JavaStudy implements IStudy {
@Override
public void study() {
System.out.println(
"liuhy学习JAVA");
}
}
package com.liuhy.sdp.dip;
/**
* Created on 2020/5/30.
*
*
@author haiyu Liu
*/
public interface IStudy {
void study();
}
package com.liuhy.sdp.dip;
/**
* Created on 2020/5/30.
*
*
@author haiyu Liu
*/
public class Liuhy {
//最少知道
private IStudy iStudy;
public Liuhy() {
}
public void studyJava(){
System.out.println(
"liuhy在学习JAVA");
}
public void studyGo(){
System.out.println(
"liuhy在学习GO");
}
public void studyC(){
System.out.println(
"liuhy在学习C");
}
public void dostudy(IStudy iStudy){
iStudy.study();
}
public Liuhy(IStudy iStudy){
this.iStudy=iStudy;
}
public void dostudy(){
this.iStudy.study();
}
}
package com.liuhy.sdp.dip;
/**
* Created on 2020/5/30.
*
*
@author haiyu Liu
*/
public class test {
public static void main(String[] args) {
//如果liuhy要学习AI了,怎么办?,还要创建一个方法,那么在实现的地方及调用的地方都需要修改
Liuhy liuhy=new Liuhy();
liuhy.studyJava();
liuhy.studyGo();
liuhy.studyC();
//因此抽象了一下顶层接口,在liuhy类中加入dostudy
liuhy.dostudy(new JavaStudy());
//另外还可以在构造方法时,传入类的方式,依赖注入
liuhy.dostudy(new GoStudy());
liuhy.dostudy();
}
}


技术分享图片


5.接口隔离原则(Interface Segregation Principle,ISP)

接口隔离原则是指面向接口编程,在接口中尽量只包含调用者感兴趣的方法。

The dependency of one class to another one should depend on the smallest possible interface.


package com.liuhy.sdp.isp;
/**
* Created on 2020/5/30.
*
*
@author haiyu Liu
*/
//public class Cooker implements IManagement {
public class Cooker implements ICooker {
// @Override
// public void managementBook() {
// System.out.println("厨师不用管理书");
// }
//
// @Override
// public void managementStudent() {
// System.out.println("厨师不用管理学生");
// }

@Override
public void doCook() {
System.out.println(
"厨师用做饭");
}
@Override
public void doWork() {
System.out.println(
"厨师用工作");
}
@Override
public void managementTime() {
System.out.println(
"厨师管理时间");
}
// @Override
// public void doSutdy() {
// System.out.println("厨师不用学习");
// }
}
package com.liuhy.sdp.isp;
/**
* Created on 2020/5/30.
*
*
@author haiyu Liu
*/
public interface ICooker {
void doCook();
void doWork();
void managementTime();
}
package com.liuhy.sdp.isp;
/**
* Created on 2020/5/30.
*
*
@author haiyu Liu
*/
public interface IManagement {
//在这个接口中有教师、学生、厨师的一个些工作,其中有些需要分别实现的的,有些不需要实现的
void managementBook();
void managementStudent();
void doCook();
void doWork();
void managementTime();
void doSutdy();
//根据接口隔离原则,应该建立一个单一的接口,类对接口的依赖应该是最小的,接口的方法要适度,因此
//我们把接口进行细化,并拆分成三个接口。

}
package com.liuhy.sdp.isp;
/**
* Created on 2020/5/30.
*
*
@author haiyu Liu
*/
public interface ISudtent {
void managementTime();
void doSutdy();
}
package com.liuhy.sdp.isp;
/**
* Created on 2020/5/30.
*
*
@author haiyu Liu
*/
public interface ITeacher {
void managementBook();
void managementStudent();
void doWork();
void managementTime();
}
package com.liuhy.sdp.isp;
/**
* Created on 2020/5/30.
*
*
@author haiyu Liu
*/
//public class Sutdent implements IManagement {
public class Sutdent implements ISudtent {
// @Override
// public void managementBook() {
// System.out.println("学生不用管理书");
// }
//
// @Override
// public void managementStudent() {
// System.out.println("学生不用管理学生");
// }
//
// @Override
// public void doCook() {
// System.out.println("学生不用做饭");
// }
//
// @Override
// public void doWork() {
// System.out.println("学生不用工作");
// }

@Override
public void managementTime() {
System.out.println(
"学生管理时间");
}
@Override
public void doSutdy() {
System.out.println(
"学生应该学习");
}
}
package com.liuhy.sdp.isp;
/**
* Created on 2020/5/30.
*
*
@author haiyu Liu
*/
//public class Teacher implements IManagement {
public class Teacher implements ITeacher {
@Override
public void managementBook() {
System.out.println(
"老师用管理书");
}
@Override
public void managementStudent() {
System.out.println(
"老师用管理学生");
}
// @Override
// public void doCook() {
// System.out.println("老师不用做饭");
// }

@Override
public void doWork() {
System.out.println(
"老师用工作");
}
@Override
public void managementTime() {
System.out.println(
"老师管理时间");
}
// @Override
// public void doSutdy() {
// System.out.println("老师不用学习");
// }
}
package com.liuhy.sdp.isp;
/**
* Created on 2020/5/30.
*
*
@author haiyu Liu
*/
public interface IManagTime {
void managementTime();
}


技术分享图片


6.迪米特原则(Law of Demeter,LOD)

迪米特原则又叫最少知道原则(Least Knowledge Principle,LKP)

Talk only to your immediate friends and not to strangers。


package com.liuhy.sdp.lod;
import java.util.ArrayList;
import java.util.List;
/**
* Created on 2020/5/30.
*
*
@author haiyu Liu
*/
public class Boss {
public void commandCheckWork(Leader leader){
// List workList=new ArrayList();
// for(int i=0;i<5;i++){
// workList.add(new Work(i));
// }
// leader.checkWorks(workList);
//检查完工作,向boss汇报一下就成了,不想知道leader具体怎么检查的
leader.checkWorks();
}
}
package com.liuhy.sdp.lod;
import java.util.ArrayList;
import java.util.List;
/**
* Created on 2020/5/30.
*
*
@author haiyu Liu
*/
public class Leader {
public void checkWorks(List workList){
System.out.println(
"检查工作数量:"+workList.size());
}
public void checkWorks(){
List
workList=new ArrayList();
for(int i=0;i<5;i++){
workList.add(
new Work(i));
}
System.out.println(
"检查工作数量:"+workList.size());
}
}
package com.liuhy.sdp.lod;
/**
* Created on 2020/5/30.
*
*
@author haiyu Liu
*/
public class Work {
public Work(Integer i){
System.out.println(
"我是第"+i+"项工作");
}
}
package com.liuhy.sdp.lod;
/**
* Created on 2020/5/30.
*
*
@author haiyu Liu
*/
public class test {
public static void main(String[] args) {
//其实,老板不需要知道你检查工作的过程,也不需要知道具体的工作是什么,只需要检查完汇报给他就行了。
Boss boss=new Boss();
Leader leader
=new Leader();
boss.commandCheckWork(leader);
//因此,我们可以把检查工作的过程放到leader类中,因此修改了 leader.checkWorks();

}
}


技术分享图片


7.合成复用原则(Composite/Aggregate Reuse Principle,CARP)

合成复用原则是指要求在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。如果要使用继承关系,则必须严格遵循里氏替换原则。合成复用原则同里氏替换原则相辅相成的,两者都是开闭原则的具体实现规范。


package com.liuhy.sdp.carp;
/**
* Created on 2020/5/30.
*
*
@author haiyu Liu
*/
public abstract class DBConnect {
public abstract void connection();
}
package com.liuhy.sdp.carp;
/**
* Created on 2020/5/30.
*
*
@author haiyu Liu
*/
public class DBConnection {
public void connection(){
System.out.println(
"我是MySQL数据库连接");
}
}
package com.liuhy.sdp.carp;
/**
* Created on 2020/5/30.
*
*
@author haiyu Liu
*/
public class MySQLConnect extends DBConnect {
@Override
public void connection() {
System.out.println(
"我是MySQL连接");
}
}
package com.liuhy.sdp.carp;
/**
* Created on 2020/5/30.
*
*
@author haiyu Liu
*/
public class OracleConnect extends DBConnect {
@Override
public void connection() {
System.out.println(
"我是Oracle连接");
}
}
package com.liuhy.sdp.carp;
/**
* Created on 2020/5/30.
*
*
@author haiyu Liu
*/
public class StudentDao {
//尽量使用组合、聚合关系,而不是使用继承关系达到复用目的,降低类与类之间的耦合度。
//有利于扩展,因此建立一个DBconnet抽象类,MySQLConnect,OracleConnect实现类
private DBConnection dbConnection;
private DBConnect dbConnect;
public void setDbConnection(DBConnection dbConnection) {
this.dbCOnnection= dbConnection;
}
public void addStudent(){
System.out.println(dbConnection
+"增加一个学生");
}
public void addStudent(DBConnect dbConnect){
this.dbCOnnect=dbConnect;
System.out.println(dbConnect
+"增加一个学生");
}
}
package com.liuhy.sdp.carp;
/**
* Created on 2020/5/30.
*
*
@author haiyu Liu
*/
public class test {
public static void main(String[] args) {
StudentDao studentDao
=new StudentDao();
studentDao.setDbConnection(
new DBConnection());
studentDao.addStudent();
//
studentDao.addStudent(new MySQLConnect());
}
}


技术分享图片


8.设计原则总结

学习设计原则,是设计模式的基础。在实际过程中,应该有一定度的遵循设计原则,不要为设计原则而设计原则。

 

  

 

 


推荐阅读
  • egg实现登录鉴权(七):权限管理
    权限管理包含三部分:访问页面的权限,操作功能的权限和获取数据权限。页面权限:登录用户所属角色的可访问页面的权限功能权限:登录用户所属角色的可访问页面的操作权限数据权限:登录用户所属 ... [详细]
  • 本文由chszs撰写,详细介绍了Apache Mina框架的核心开发流程及自定义协议处理方法。文章涵盖从创建IoService实例到协议编解码的具体步骤,适合希望深入了解Mina框架应用的开发者。 ... [详细]
  • 本文提供了一个关于AC自动机(Aho-Corasick Algorithm)的详细解析与实现方法,特别针对P3796题目进行了深入探讨。文章不仅涵盖了AC自动机的基本概念,还重点讲解了如何通过构建失败指针(fail pointer)来提高字符串匹配效率。 ... [详细]
  • 本报告记录了嵌入式软件设计课程中的第二次实验,主要探讨了使用KEIL V5开发环境和ST固件库进行GPIO控制及按键响应编程的方法。通过实际操作,加深了对嵌入式系统硬件接口编程的理解。 ... [详细]
  • LeetCode 102 - 二叉树层次遍历详解
    本文详细解析了LeetCode第102题——二叉树的层次遍历问题,提供了C++语言的实现代码,并对算法的核心思想和具体步骤进行了深入讲解。 ... [详细]
  • 深入解析Unity3D游戏开发中的音频播放技术
    在游戏开发中,音频播放是提升玩家沉浸感的关键因素之一。本文将探讨如何在Unity3D中高效地管理和播放不同类型的游戏音频,包括背景音乐和效果音效,并介绍实现这些功能的具体步骤。 ... [详细]
  • 本文介绍了一个来自AIZU ONLINE JUDGE平台的问题,即清洁机器人2.0。该问题来源于某次编程竞赛,涉及复杂的算法逻辑与实现技巧。 ... [详细]
  • 本文介绍了用户界面(User Interface, UI)的基本概念,以及在iOS应用程序中UIView及其子类的重要性和使用方式。文章详细探讨了UIView如何作为用户交互的核心组件,以及它与其他UI控件和业务逻辑的关系。 ... [详细]
  • 本文探讨了线性表中元素的删除方法,包括顺序表和链表的不同实现策略,以及这些策略在实际应用中的性能分析。 ... [详细]
  • 实现Win10与Linux服务器的SSH无密码登录
    本文介绍了如何在Windows 10环境下使用Git工具,通过配置SSH密钥对,实现与Linux服务器的无密码登录。主要步骤包括生成本地公钥、上传至服务器以及配置服务器端的信任关系。 ... [详细]
  • 汇总了2023年7月7日最新的网络安全新闻和技术更新,包括最新的漏洞披露、工具发布及安全事件。 ... [详细]
  • JavaScript 中引号的多层嵌套使用技巧
    本文详细介绍了在 JavaScript 编程中如何处理引号的多级嵌套问题,包括双引号、单引号以及转义字符的正确使用方法。 ... [详细]
  • 解决UIScrollView自动偏移问题的方法
    本文介绍了一种有效的方法来解决在使用UIScrollView时出现的自动向下偏移的问题,通过调整特定的属性设置,可以确保滚动视图正常显示。 ... [详细]
  • 如何高效渲染JSON数据
    本文介绍了在控制器中返回JSON结果的方法,并详细说明了如何利用jQuery处理和展示这些数据,为Web开发提供了实用的技巧。 ... [详细]
  • Awk是一款功能强大的文本分析与处理工具,尤其在数据解析和报告生成方面表现突出。它通过读取由换行符分隔的记录,并按照指定的字段分隔符来划分和处理这些记录,从而实现复杂的数据操作。 ... [详细]
author-avatar
阴森森林蛀
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有