#文章用于自己学习复习使用,如果能帮助到大家,深感荣幸,如果有什么不对,可以直接指出。
设计模式的基本原则
1.开闭原则
2.依赖倒置原则
3.单一职责原则
4.接口隔离原则
5.迪米特原则(最少知道法则)
6.里式替换原则
设计原则的使用在于合适的应用场景和平衡。过度追求和使用,会浪费很多不必要的成本,讲究的是一个取舍。
一、开闭原则 openclose
概念:一个模块,类,函数应该对扩展开放,对修改关闭
提倡:用抽象构建框架,用实现扩展细节
优点:提高软件系统的可复用性和维护性
例子:
售卖电器-电视机:电视机的价格日常价格,和促销价格。
先写一个电器的基类 IFurniture
interface IFurniture{
fun getPrice():Double
fun getName():String
}
接着就是日常电器的实现类-电视机
open class Television:IFurniture(){
private val price:Double
private val name:String
constructor(name:String,price:Double){
this.name=name
this.price=price
}
override fun getPrice():Double{
return price
}
override fun getName():String{
return name
}
}
最后就是促销类电器的实现类
class PromotionTelevision(name:String,price:Double):Television(name,price){
override fun getPrice():Double{
return super.getPrice()*0.8
}
fun getOriginPrice():Double{
return super.getPrice()
}
}
类图:
二、依赖倒置原则
概念:高层模块不应该依赖底层模块,二者都应该依赖其抽象
提倡:
抽象不应该依赖细节,细节应该依赖抽象
针对接口编程,不要针对实现编程
优点:减少类之间的耦合,提高体统的稳定性
例子:
nick做菜:nick有一个技能,会做菜。
class Nick{
fun action(food:IFood){
food.cooking()
}
}
食物的接口,里面有一个方法,可以被烹饪
interface IFood{
fun cooking()
}
class Fish:IFood{
override cooking(){
println("fish done")
}
}
class Egg:IFood{
override cooking(){
println("egg done")
}
}
调用的地方
val nick =Nick()
nick.action(Fish())
nick.action(Egg())
类图:
三、单一职责原则
概念:不要存在多于一个导致类变更的原因
提倡:一个类/一个接口/一个方法只负责一项职责
优点:降低类的复杂度,提高类的可读性,提高系统可维护性
例子:
一个类只有一个职能
假设老年人和年轻人喜欢吃的东西不一样,年轻人喜欢吃炸鸡,老年人喜欢喝粥。
interface Person{
fun eat(name:String)
}
class OldPerson : Person{
override fun eat(name:String){
println("${name} 喜欢喝粥“)
}
}
class YoungPerson : Person{
override fun eat(name:String){
println("${name}喜欢吃炸鸡”)
}
}
test:
val oldPerson=OldPerson()
oldPerson.eat("吴双大爷“)
val youngPerson=YoungPerson()
youngPerson.eat("lucas")
一个方法只有一个职能
四、接口隔离原则
概念:用多个专业的接口,而不使用单一的总接口,不应该依赖不需要的接口
提倡:一个类对一个类的依赖应该建立在最小的接口上,建立单一接口,尽量细化接口
优点:符合我们的高内聚低耦合思想
五、迪米特原则
概念:一个类应该对其他对象保持最少的了解
提倡:尽量降低类与类之间的耦合,只与朋友交流,不和陌生人沟通
(朋友:成员变量,输入,输出的参数)
优点:降低耦合