Hello,各位,好久没发布内容了,现在转做Java语言,目前基础已经学习一大半,正在钻研设计模式,第一天开始学习,废话不多说,走起!!!
我个人比较喜欢先概念再实战,这样可以提高自己在敲代码中的思维能力,所以这些概念都是以自己的理解(非官方),我认为只有自己理解才是自己的!!!
+一.开闭原则+
----1.1意义----
对扩展开放,对修改关闭,意思就是在程序需要更新的时候进行扩展,而不是修改自身大多数代码,易于维护与更新。
相信刚和我一样接触设计模式的小伙伴,写项目的时候很少会动用抽象与接口,这样会在项目更新一个新功能的时候修改很多细节代码,甚至其他的类也要修改,这样的会大大提高开发时间与代码复杂性。

所以我们可以这样,设计项目的时候先想象该怎么设计,根据需求设计抽象类或者接口,然后具体实现就交给它们的子类即可。修改时就可以再不动用原来的代码情况下,只需修改子类。弱话耦合性,增强多态性。抽象合理,保持代码整体结构的稳定,容易变化的细节就交给子类去实现
我理解的一句话:需求决定抽象(想象的),抽象决定子类(具体类)
------下面举个实际例子------
----1.2实战----
目前还不会用自带的UML插入索性画了一张,有点丑,不要建议

这里拿搜狗输入法举例,输入法是有背景皮肤的,但是我们可以自己调换皮肤。那我们可以根据需求先设计一个皮肤的抽象类,然后在定义默认皮肤类和一个花皮肤类继承于抽象皮肤类,实现多态。之后在将抽象类作为他的成员变量(图中的依赖关系),这样做的好处是我可以赋值给他各种各样他的子类,从而又能实现多态并且减少耦合,以后想用其他的皮肤,我就可以再定义一个皮肤的子类即可,又不用改sougou类的。
----1.3献上代码----

//抽象皮肤类
public abstract class AbstractSkin {public abstract void showName();//显示皮肤
}//默认皮肤类
public class DefaultSkin extends AbstractSkin{//重写显示皮肤方法public void showName(){System.out.println("已切换成默认皮肤");}
}//花皮肤类
public class FlowerSkin extends AbstractSkin{//重写显示皮肤方法public void showName(){System.out.println("已切换成花皮肤");}
}//搜狗输入法类
public class SougouInput {AbstractSkin skin;//构造方法public SougouInput() {this.skin = new DefaultSkin();//这里我先设置它为默认皮肤this.skin.showName();}//设置皮肤public void setSkin(AbstractSkin skin) {this.skin = skin;this.skin.showName();//打印显示皮肤}
}//测试类
public class Test {public static void main(String[] args) {//创建一个实例SougouInput sougou = new SougouInput();//在构造方法中设置默认皮肤//创建一个花皮肤对象AbstractSkin flower = new FlowerSkin();//设置花皮肤sougou.setSkin(flower);}
}

以上就是关闭原则的全部内容,请看下面的里氏换原则

+二.里氏代换原则+
原则:任何基类可以出现的地方,子类一定可以出现
通俗点讲就是子类可以扩展父类的方法,但是不能改变父类原有的功能。换句话说,子类继承父类时,可以添加功能,但尽量不要重写父类的方法,因为可能会导致整个体系的复用性变差
注:如果必须重写的话,可以将其定义为抽象

这个很容易理解,可以在以后的实战例子中慢慢去体会,来下面给大家带来今天的第三个原则,注意!!!这个原则我感觉很重要!!!

+三.依赖颠倒原则+
----3.1意义----
顾名思义是说上级和下级不要颠倒,什么意思呢?高层模块不应该依赖低层模块(被关联的类作为低层,关联的类作为高层,关联的类中有被关联的类作为成员对象)。两者都应该依赖于抽象,抽象不应该依赖于细节(具体实现),细节(具体实现)依赖于抽象。
简单来说在以后的项目开发中是面向抽象而不是面向细节(具体实现)。先抽象,后具体!!!
----3.2实战----
3.2.1拿一个电脑举例子
一台电脑需要CPU,内存条,硬盘。只有拥有这些,一台电脑才能正常运行。可CPU有很多种可以有英特尔,ATM…硬盘:希捷,西部数据…内存条:影驰,英睿达…
UML图如下(注意:图中的Computer类方法太多不够画的就不详细写,具体代码区见):
电脑需要这些配件,没有就运行不起来,所以是组合关系。在这里组合的全是配件的抽象类,需要用其他的样式的配件,只需在该配件的抽象类下在写一个具体类即可。

//CPU抽象接口
public interface Cpu {void run();//运行
}
//英特尔CPU
public class InterCpu implements Cpu{//重写运行函数public void run(){System.out.println("英特尔Cpu开始运行");}
}//硬盘抽象接口
public interface HardDisk {void save(String data);//保存数据String get();//获取数据
}
//希捷硬盘
public class XijieHardDisk implements HardDisk{private String data;public XijieHardDisk() {this.data = null;//默认设置保存为null}//保存数据public void save(String data){this.data =data;System.out.println("数据保存成功!!!");}//获取数据public String get(){return this.data;}
}//内存条抽象接口
public interface Memory {void save();//存储
}
//影驰内存条
public class YinchiMemory implements Memory{//重写save类public void save(){System.out.println("影驰内存条已开始使用");}
}//电脑
public class Computer {Cpu cpu;//CPUHardDisk hard;//硬盘Memory memory;//内存条public Computer(Cpu cpu, HardDisk hard, Memory memory) {this.cpu = cpu;this.cpu.run();//因为内电脑创建好了CPU就可以动了,所以在这里直接调用run()this.hard = hard;this.memory = memory;this.memory.save();//因为内电脑创建好了内存条就可以动了,所以在这里直接调用save()}public Cpu getCpu() {return this.cpu;}public HardDisk getHard() {return this.hard;}public Memory getMemory() {return this.memory;}public void setCpu(Cpu cpu) {this.cpu = cpu;}public void setHard(HardDisk hard) {this.hard = hard;}public void setMemory(Memory memory) {this.memory = memory;}
}//测试类
public class Test {public static void main(String[] args) {//创建一个英特尔CPUCpu cpu = new InterCpu() ;//创建一个希捷硬盘HardDisk hardDisk = new XijieHardDisk();//创建一个影驰内存条Memory memory = new YinchiMemory();//创建一台电脑Computer computer = new Computer(cpu,hardDisk,memory);//硬盘存储数据computer.getHard().save("HelloWorld");//打印硬盘中的数据System.out.println("硬盘中的数据为"+computer.getHard().get());}
}

学习设计模式会很快的提升自己思维。以上就是今天的全部内容了,很快更新其他三个原则啦!!!

Java设计模式:1.1.认识六个原则(开闭,里氏替代,依赖颠倒)相关推荐

  1. Java设计模式GOF之6大设计原则

    Java设计模式GOF之6大设计原则原则 1.开闭原则(Open Close Principle) 一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. 开闭原则是面向对象的可复用设计的第一块基石 ...

  2. Java设计模式(一)面向对象设计原则

    面向对象设计原则 **注意:**推荐完成JavaEE通关路线再开始学习. 我们在进行软件开发时,不仅仅需要将最基本的业务给完成,还要考虑整个项目的可维护性和可复用性,我们开发的项目不单单需要我们自己来 ...

  3. 设计模式之王者原则 开闭原则

    设计模式之王者原则  开闭原则 为什么说 它--开闭原则是王者原则呢? 因为所有原则都是围绕它来实现的,怎么说呢,为什么会有这么多原则呢,都是为了完成它,只要实现它你的代码就不会有什么大的问题 一.定 ...

  4. 设计模式6大原则-开闭原则

    设计模式6大原则-开闭原则 定义:一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. 开闭原则理念就是当需求改变时,希望在不改变原有代码的前提下,通过扩展模块.函数来满足新需求. 开闭原则是其他 ...

  5. 六大设计原则--开闭原则

    定义 software entities like classes, modules and functions should be open for extension but closed for ...

  6. 带你认识六种设计原则(开闭原则、里氏代换原则、依赖倒转原则....)

    前言 1. 设计原则 1.1. 开-闭原则 1.2. 里氏代换原则 1.3. 依赖倒转原则 1.4. 接口隔离原则 1.5. 合成/聚合原则 1.6. 迪米特法则 前言 学习设计模式之前先要了解其中的 ...

  7. Java设计模式【之】 七大设计原则(有道有术,代码示例)

    Java设计模式[之] 有道有术(设计原则,代码示例) 名词解析 1.单一职责 2.接口隔离 3.依赖倒置(面向接口编程) 4.里氏替换 5.开闭原则(ocp) 6.迪米特(好朋友原则) 7.合成复用 ...

  8. Java设计模式之设计的6大原则(开闭原则,里氏代换原则,依赖倒转原则,接口隔离原则,最少知道原则,合成复用原则)

    1. 开闭原则 核心思想:一个对象对外扩展开发,对修改关闭 意思就是:对类的改动是通过增加代码进行的,而不是修改现有的代码. 也就是说软件开发人员一旦写出了可以运行的代码,就不应该去改动它,而是要保证 ...

  9. Java设计模式第一章(软件设计原则)(学习笔记)

    3.1软件设计原则 为什么要有软件设计原则:在软件开发过程中,为了提高软件系统的可维护性和可复用性,增加软件的可扩展性和灵活性,程序员要尽量根据6条原则来开发程序,从而提高软件开发效率,节约软件开发成 ...

  10. Java设计模式七大原则-开闭原则

    开闭原则 基本介绍 开闭原则(Open Closed Principle)是编程中最基础.最重要的设计原则 一个软件实体如类,模块和函数应该对扩展开放(对提供方),对修改关闭(对使用方).用抽象构建框 ...

最新文章

  1. ERROR: Manifest merger failed : uses-sdk:minSdkVersion 24 cannot be smaller than version 27 declared
  2. Docker 不香吗,为啥还要 K8s?
  3. 【C 语言】字符串拷贝 ( 函数形参使用推荐方法 | 凡是涉及 修改指针指向 的操作一律创建新的 指针变量 执行 | 引入 辅助 局部 指针变量 )
  4. Cocos2d-x 常见宏
  5. linux操作系统上课,Linux操作系统使用的文件系统是
  6. Java Annotation详解
  7. 【软件开发底层知识修炼】十一 链接器-链接脚本
  8. mysql改了排序规则不生效_Mysql数据库表排序规则不一致导致联表查询,索引不起作用问题...
  9. SQL Server 锁
  10. Nginx完美解决前后端分离端口号不同导致的跨域问题
  11. 头发mod_《巫师3》:新MOD为三个大妹子,4K超清贴图看过来
  12. [原创]java WEB学习笔记103:Spring学习---Spring Bean配置:基于注解的方式(基于注解配置bean,基于注解来装配bean的属性)...
  13. C++.Net在Release方式下单步调试时需要修改一些设置,否则变量会有错位或乱码,切记!...
  14. C语言图书管理信息系统
  15. AHCI 与 IDE
  16. ubuntu安装一些有用的小插件
  17. 阿里云服务器优惠活动地址
  18. C#批量剪切视频文件
  19. Docker-镜像的优化
  20. 阿里云 mysql emoji_如何在 MySQL 中存储 emoji ?

热门文章

  1. c语言printf输出整数数字,C语言 念数字 输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字...
  2. 颜色搭配之BUTTONS 1.0
  3. 前端-项目引入苹方字体
  4. 一个FC游戏的下载站点
  5. Win7系统彻底删除打印机驱动
  6. 微信小程序实现手机屏幕左右旋转,页面元素左右移动,小程序加速计
  7. Flink on Yarn报错:Container released on a *lost* node
  8. java 高效计算99乘法表_【九九乘法表】九九乘法表学习攻略 九九乘法表快速记忆小诀窍...
  9. 生死看淡,不服就GAN(五)----用DCGAN生成MNIST手写体
  10. 如何在Chrome浏览器中导入和导出密码