java设计原则

设计模式就是前辈们总结出来的设计方法。不同的设计模式适用于不同的场景。
公认的设计模式有23种。千万不要认为有任何一种设计模式能够解决任何问题,每一种设计模式只能用于特定的场景,而不是万能的。设计模式有优点,也有缺点,不能为了使用设计模式而使用设计模式。切记模式的滥用。

单一职责原则:每个方法,每个类,每个框架只负责一件事。
优点:代码的重用性提高,代码的可读性提高,就像大纲一样。

开闭原则:对扩展开放,对修改关闭,在不改变源代码的情况下,添加新的功能。
刮胡刀就只刮胡子,想要有吹风机功能。符合开闭原则的做法是,这个刮胡刀既能刮胡子,又能吹风。例子:有一个车,我们可以通过getPrice()获得这辆车的价格,但是我们现在要对车进行打折,这个时候要想不违背开闭原则,那么就可以创建一个Car的子类DiscountCar打折车,重新getPrice()方法,这个时候创建的时候,创建子类DiscountCar上转型为Car。
如果一个类,从头到尾都是你自己写的,那么你就可以随时修改源代码,因为作者就是你。但是如果这个类是别人写的,那么你就不能随意的修改,要符合开闭原则。

接口隔离原则:接口应该尽量细化,一个接口对应一个功能模块,接口中的方法应该尽可能的少,使接口更加灵活。
反例:一个animal接口里定义了eat(),fly(),swim(),当鸟实现该接口,虽然鸟不会swim,但是还是要实现swim方法,所以我们应该把animal这个类进行细化,animal这个接口定义共有的,然后再定义ableFly()和ableSwim()方法。

依赖倒置原则:上层不能依赖于下层,他们应该都依赖于抽象。上层:调用别的方法的就是上层,main()方法调用别的方法,main()方法就是上层。下层:被调用的方法就是下层。违反依赖倒置原则:每当下层变动时,上层也要变动。我们定义了一个狗,然后定义一个人,有一个feed(Dog dog)。但是当我们定义一个猫时,如果要喂猫,那么就要在人中在定义一个方法feed(Cat cat),这样就违反了依赖倒置原则。此时我们就可以定义一个接口Animal,然后猫和狗都实现Animal,Person类中,feed中传入的参数是(Animal animal)。

迪米特法则:最少知道原则,一个类,对于其他类,要知道的越少越好。主要体现封装的思想,只和朋友通信。朋友:类中的字段,方法的参数,方法的返回值,方法中实例化出来的对象。
比如Computer类,里面有saveData(),killProcess(),closeScreen(),stopPower(),当人要关机时,需要创建computer类,然后依次调用这四个方法,此时就是违背了迪米特法则,我们可以在Computer类中封装这四个方法,然后提供一个shutDownComputer()方法,我们只需要调用这一个方法即可。
关于朋友的理解:如果我们在Person中设立一个f1()方法,方法的参数是Computer,那么我们就可以在方法中调用Computer的任何方法,如果没有参数,但是该方法的返回值是Computer,那么我们在方法中也可以调用Computer的任何方法。但是如果我们在方法中调用Computer的方法得到了一个Keyboard类,此时Keyboard类就不是朋友,我们就不能随意调用Keyboard的方法。符合迪米特法则的做法就是再设立一个f2()方法,keyboard为该方法的参数,在这个方法中调用我们要调用的keyboard的方法,然后我们在f1()方法中调用f2(keyboard)。
缺点:系统中出现了很多的小方法。f2()就是一个小方法。
不过不一定要遵循这个法则,只是一种建议,要视情况而定。主要是封装。

里式替换原则:任何能使用父类对象的地方,都应该能透明的替换为子类对象。也就是说子类对象可以随时随地替换父类对象,替换后语法不会报错,业务也不会出现问题。
子类方法的修饰符不能比父类方法更严格,子类方法抛出的异常不能比父类方法多。这两个限制就是为了符合里式替换原则。
正方形属于特殊的长方形,但是当考虑到具体的业务场景,在进行里式替换原则之后,业务逻辑发生变化,此时正方形就不能继承长方形了。

组合优于继承:指的就是关联优于继承。
类与类之间的关系:继承,依赖(B类中有一个方法,方法里定义了一个A类),关联:一个类作为一个类的字段或者属性比如在类B中有一个属性A类。在另一个类中作为字段就是关联,作为局部变量就是依赖。
关联:分为组合和聚合
大雁和翅膀:组合,关系很强。
大雁和雁群:聚合,关系弱。
组合优于继承的证明:如果我们需要统计set中添加过的元素的个数,此时我们可以创建一个MySet继承HashSet,定义一个变量,自己重写add()方法,当使count++,然后再调用父类的add()方法,但是有可能别的方法也是添加,这样我们还要重写别的方法,另外后期add()方法或许还会被改动,以及等等。
何时使用继承何时使用组合?
如果父类作者和子类作者是同一个人,那么就使用继承,如果不是同一个人,那么就使用组合,因为你不知道作者什么时候会更改源代码等等。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值