面向对象设计原则-SOLID
SOLID的意思是:
- Single responsibility principle 单一职责原则
- Open/close principle 开放/封闭原则
- Liskov substitution principle 里氏替换原则
- Interface segregation principle 接口分离原则
- Dependency inversion principle 依赖倒置原则
简解:
单一职责原则:
一个类应该只有一个被改变的理由,也就是类应该只有一个职责。
开放/封闭原则:
类、方法、模块等应该对扩展开发,对修改封闭。
里氏替换原则:
子类可以扩展父类的功能,但不要去改变父类原有的功能。
接口分离原则:
创建更精细的接口供客户程序使用。
依赖倒置原则:
模块不依赖它需要的模块。而是依赖于抽象的定义。
详解:
单一职责原则:
在定义一个类时,让其只有一个职责就行了。
来举例说明,错误的示例:
Class A //供别人使用的低级功能类
{
Say(String s)
{
//具体实现
}
}
Class B //B类是重点,此类的实现违背了单一职责原则,它现在有两个职责,一是管理A的绳命周期,二是自己的业务逻辑。
{
A a;
Public B()
{
a = new A();
}
void SayWrong()
{
A.Say("老头子他又错了");
}
}
B类正确的设计:
Class B //B类这样就正确了,只有了自己的业务逻辑单一职责,管理A的绳命周期交给别的类去实现。
{
A a;
Public B(A a)
{
this.a = a;
}
void SayWrong()
{
A.Say("我哪错了啊");
}
}
开放/封闭原则:
平时我们使用控件时,如Button类,把它看做基类,利用继承可以制作自己特别功能的按钮(对扩展开放),但是不要直接修改Button类,即使你有Button类的源码也不要修改(对修改封闭)。这就是开闭原则的一个应用。
里氏替换原则:
里氏是个妇女的姓氏,替换的意思详看下面的例子
    class Program
        {
              static void Main(string[] args)
              {
                    ISpeak iSpeak = new EnglishSpeak();//此处或是 new ChineseSpeak();
                    iSpeak.Say();//当调用Say方法时,iSpeak指向的是EnglishSpeak实例就显示“英国话”,同理,指向ChineseSpeak实例就显示“中国话”
                    Console.ReadKey();
               }
        }
    interface ISpeak
        {
              void Say();
        }
    class ChineseSpeak:ISpeak
        {
              public void Say()
              {
                    Console.WriteLine("中国话");
              }
        }
    class EnglishSpeak : ISpeak
        {
              public void Say()
              {
                    Console.WriteLine("英国话");
              }
}
替换是利用多态实现的。ChineseSpeak和EnglishSpeak类都有ISpeak定义的Say方法,在客户端程序的Main中,你想替换成哪个具体实现类都成。里氏替换的约束是子类只是去实现父类的约束。如果父类是类不是接口的话,不要去覆盖父类已经实现的方法,可以覆盖父类的抽象方法。
接口分离原则:
举个列子:
interface A
{
a();
b();
c();//如果c不是客户端常用的方法
}
应该把接口A拆分成:
interface A
{
a();
b();
}
interface B
{
c();
}
这样的好处是,如果方法特别多,客户端使用时看到很多方法闹眼睛。
class clent()
{
B ib;
publc(B ib)
{
this.ib = ib;
}
public void clentC()
{
ib.C();
}
}
依赖倒置原则:
错误的示例:
Class A //供别人使用的低级功能类
{
Say(String s)
{
//具体实现
}
}
Class B //B类完全依赖A类,如果A类改了,B类就得改。
{
A a;
Public B(A a)
{
this.a = a;
}
void SayWrong()
{
A.Say("我哪错了啊");
}
}
正解:
interface iA
{
Say(String s);
}
Class A:iA //供别人使用的低级功能类
{
Say(String s)
{
//具体实现
}
}
Class B //B类现在依赖的是iA这个接口,A类的实现也得按照这个接口来。大家都遵循iA的约束。
{
iA a;
Public B(iA a)
{
this.a = a;
}
void SayWrong()
{
A.Say("我哪错了啊");
}
}
初学咋练,如有错误,多指教。
面向对象设计原则-SOLID的更多相关文章
- 【转】面向对象设计的SOLID原则
		S.O.L.I.D是面向对象设计和编程(OOD&OOP)中几个重要编码原则(Programming Priciple)的首字母缩写. SRP The Single Responsibility ... 
- 面向对象设计的SOLID原则
		S.O.L.I.D是面向对象设计和编程(OOD&OOP)中几个重要编码原则(Programming Priciple)的首字母缩写. SRP The Single Responsibility ... 
- OOD 面向对象面试干货分享| 面向对象设计的SOLID原则
		S.O.L.I.D是面向对象设计和编程(OOD&OOP)中几个重要编码原则(Programming Priciple)的首字母缩写. 简写 全拼 中文翻译 SRP The Single Res ... 
- Java程序员应该了解的10个面向对象设计原则
		面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorat ... 
- 面向对象设计原则OO
		面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ... 
- (转)Java程序员应该了解的10个面向对象设计原则
		面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ... 
- Java程序员应当知道的10个面向对象设计原则
		面向对象设计原则是OOPS编程的核心, 但我见过的大多数Java程序员热心于像Singleton (单例) . Decorator(装饰器).Observer(观察者) 等设计模式,而没有把足够多的注 ... 
- [译]Java 程序员应该了解的 10 个面向对象设计原则
		面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ... 
- 【Java工程师之路】[1-2.2]Java10个面向对象设计原则
		面向对象设计原则是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorator ... 
随机推荐
- Python3+Selenium3自动化测试-(四)
			selenium鼠标事件 # coding=utf-8 import time from selenium import webdriver from selenium.webdriver.commo ... 
- Pantone色卡——安全装备的面板、丝印及铭牌颜色设计参考
			可以参考上传文件<Pantone色卡电子版下载> 
- eslasticsearch操作集锦
			索引-index:一个索引就是一个拥有几分相似特征的文档的集合.比如说,你可以有一个客户数据的索引,另一个产品目录的索引,还有一个订单数据的索引.一个索引由一个名字来标识(必须全部是小写字母的),并且 ... 
- 在windows上搭建redis集群
			一 所需软件 Redis.Ruby语言运行环境.Redis的Ruby驱动redis-xxxx.gem.创建Redis集群的工具redis-trib.rb 二 安装配置redis redis下载地址 ... 
- uiautomator定位元素
- go——通道(二)
			在Go语言里面,你不仅可以使用原子函数和互斥锁来保证对共享资源的安全访问以消除竞争状态, 还可以使用通道,通过发送和接收需要共享的资源,在goroutine之间做同步. 当一个资源需要在gorouti ... 
- mysql忽略一些错误代码
			模拟的故障,在从库中新建一个库,然后主库新建一个与从库相同名字的库,然后进入下面的show Mysql从库复制故障解决 当show slave status:报错 slave_io_running:y ... 
- 浅谈WebService SOAP、Restful、HTTP(post/get)请求
			http://www.itnose.net/detail/6189456.html 浅谈WebService SOAP.Restful.HTTP(post/get)请求 2015-01-09 19:2 ... 
- PAT 天梯赛 L1-019. 谁先倒 【水】
			题目链接 https://www.patest.cn/contests/gplt/L1-019 AC代码 #include <iostream> #include <cstdio&g ... 
- HDU - 6437 Problem L.Videos 2018 Multi-University Training Contest 10 (最小费用最大流)
			题意:M个影片,其属性有开始时间S,结束时间T,类型op和权值val.有K个人,每个人可以看若干个时间不相交的影片,其获得的收益是这个影片的权值val,但如果观看的影片相邻为相同的属性,那么收益要减少 ... 
