概述
目录
一、设计目的
二、七大原则
(一)单一职责原则 SRP(Single Responsibility Principle)
(二)接口隔离原则 ISP(Interface Segregation Principle)
(三)依赖倒转原则 DIP (Dependence Inversion Principle)
(四)里氏替换原则 LSP (Liskov Subsitution Principle)
(五)开闭原则 OCP (Open Closed Principle)
(六)迪米特法则 DP (Demeter Principle)
(七)合成复用原则 CRP(Composite Reuse Principle)
三、小结
一、设计目的
1. 重用性(即:相同功能的代码,不用多次编写)
2. 可读性(即:编程规范性,便于其他程序员的阅读和理解)
3. 可扩展性(即:当要增加新的功能时,非常的方便.称为可维护)
4. 可靠性(即:当我们增加新的功能后,对原来的功能没有影响)
5. 使程序呈现高内聚.低耦合的特性
二、七大原则
(一)单一职责原则 SRP(Single Responsibility Principle)
public class SingleResponsibility1 {
public static void main(String[] args) {
Animal animal = new Animal();
animal.eat("鲨鱼");
animal.eat("杜鹃");
}
}
class Animal{
public void eat(String animalName){
System.out.println(animalName + "在海里进食");
}
}
应用原则后:
public class SingleResponsibility2 {
public static void main(String[] args) {
new Fish().eat("鲨鱼");
new Bird().eat("杜鹃");
}
}
class Fish {
public void eat(String animalName) {
System.out.println(animalName + "在海里进食");
}
}
class Bird {
public void eat(String animalName) {
System.out.println(animalName + "在陆地上进食");
}
}
突出作用:
(二)接口隔离原则 ISP(Interface Segregation Principle)
低级代码:
public class InterfaceSegregationPrinciple1 {
public static void main(String[] args) {
OneMan m = new OneMan();
m.show(new Man());
OneWoman w = new OneWoman();
w.show(new Woman());
}
}
interface IBuy {
void buySkirt();
void buyPants();
void buyDress();
}
class Man implements IBuy {
@Override
public void buySkirt() {
System.out.println("男士买衬衫");
}
@Override
public void buyPants() {
System.out.println("男士买裤子");
}
@Override
public void buyDress() {
System.out.println("男士买裙子");
}
}
class Woman implements IBuy {
@Override
public void buySkirt() {
System.out.println("女士买衬衫");
}
@Override
public void buyPants() {
System.out.println("女士买裤子");
}
@Override
public void buyDress() {
System.out.println("女士买裙子");
}
}
class OneMan{
public void buySkirt(IBuy buy){
buy.buySkirt();
}
public void buyPants(IBuy buy){
buy.buyPants();
}
}
class OneWoman{
public void buyDress(IBuy buy){
buy.buyDress();
}
public void buySkirt(IBuy buy){
buy.buySkirt();
}
}
应用原则后(OneMan只需要买衬衫和裤子即可,所以Man类无需多实现个买裙子的方法;Woman类同理。但因为实现Buy接口,所以抽象方法都得实现,故拆分接口):
package com.principle.interfaceSegregationPrinciple;
public class InterfaceSegregationPrinciple2 {
public static void main(String[] args) {
OneMan2 m = new OneMan2();
m.buyPants(new Man2());
m.buySkirt(new Man2());
//
OneWoman2 w = new OneWoman2();
w.buyDress(new Woman2());
w.buySkirt(new Woman2());
}
}
interface IBuyWomanClothes {
void buyDress();
}
interface IBuyManClothes{
void buyPants();
}
interface IBuyCommonClothes{
void buySkirt();
}
class Man2 implements IBuyManClothes, IBuyCommonClothes {
@Override
public void buySkirt() {
System.out.println("男士买衬衫");
}
@Override
public void buyPants() {
System.out.println("男士买裤子");
}
}
class Woman2 implements IBuyWomanClothes , IBuyCommonClothes {
@Override
public void buySkirt() {
System.out.println("女士买衬衫");
}
@Override
public void buyDress() {
System.out.println("女士买裙子");
}
}
class OneMan2{
public void buySkirt(IBuyCommonClothes buy){
buy.buySkirt();
}
public void buyPants(IBuyManClothes buy){
buy.buyPants();
}
}
class OneWoman2{
public void buyDress(IBuyWomanClothes buy){
buy.buyDress();
}
public void buySkirt(IBuyCommonClothes buy){
buy.buySkirt();
}
}
效果如下:
由
拆成
(三)依赖倒转原则 DIP (Dependence Inversion Principle)
我的理解是:依赖倒转,把本来在封装中的类改为接口,而在入口(调用封装方法)的地方使用具体想要的类。
低级代码:
public class DependenceInversionPrinciple1 {
public static void main(String[] args) {
new Developer().setMessage(new WeiXinSmallApp());
}
}
class WeiXinSmallApp{
public void showMessage(){
System.out.println("微信小程序新活动");
}
}
class Developer{
// 该方法的参数列表就直接依赖WeiXinSmallApp类,这使得不适用于其他类
public void setMessage(WeiXinSmallApp weiXinSmallApp){
weiXinSmallApp.showMessage();
}
}
应用原则后(依赖倒转有三种实现方式,1) 接口传递 2) 构造方法传递 3) setter方式传递 。分别如下):
// ① 在封装方法的参数列表中使用接口
public class DependenceInversionPrinciple2 {
// 依赖倒转,把本来在封装中的类改为接口,而在入口(调用封装方法)的地方使用具体想要的类。
public static void main(String[] args) {
Developer2 developer2 = new Developer2();
developer2.setMessage(new WeiXinSmallApp2());
developer2.setMessage(new AndroidApp());
}
}
class WeiXinSmallApp2 implements IProduct {
@Override
public void showMessage() {
System.out.println("微信小程序新活动");
}
}
class AndroidApp implements IProduct{
@Override
public void showMessage() {
System.out.println("安卓App新活动");
}
}
interface IProduct {
void showMessage();
}
class Developer2 {
public void setMessage(IProduct iProduct) {
iProduct.showMessage();
}
}
// ② 在封装方法声明接口变量,在构造器中赋值接口,在方法中调用接口变量
public class DependenceInversionPrinciple2 {
// 依赖倒转,把本来在封装中的类改为接口,而在入口(调用封装方法)的地方使用具体想要的类。
public static void main(String[] args) {
new Developer2(new WeiXinSmallApp2()).setMessage();
new Developer2(new AndroidApp()).setMessage();
}
}
class WeiXinSmallApp2 implements IProduct {
@Override
public void showMessage() {
System.out.println("微信小程序新活动");
}
}
class AndroidApp implements IProduct{
@Override
public void showMessage() {
System.out.println("安卓App新活动");
}
}
interface IProduct {
void showMessage();
}
class Developer2 {
// 这么做就从方法的范围跳到成员变量的范围(其他方法也可以使用)
IProduct iProduct;
public Developer2(IProduct iProduct) {
this.iProduct = iProduct;
}
public void setMessage() {
this.iProduct.showMessage();
}
}
// ③ 在封装方法声明接口变量,在setter中赋值接口,在方法中调用接口变量
public class DependenceInversionPrinciple2 {
// 依赖倒转,把本来在封装中的类改为接口,而在入口(调用封装方法)的地方使用具体想要的类。
public static void main(String[] args) {
Developer2 developer2 = new Developer2();
developer2.setIProduct(new WeiXinSmallApp2());
developer2.setMessage();
//
developer2.setIProduct(new AndroidApp());
developer2.setMessage();
}
}
class WeiXinSmallApp2 implements IProduct {
@Override
public void showMessage() {
System.out.println("微信小程序新活动");
}
}
class AndroidApp implements IProduct{
@Override
public void showMessage() {
System.out.println("安卓App新活动");
}
}
interface IProduct {
void showMessage();
}
class Developer2 {
// 这么做就从方法的范围跳到成员变量的范围(其他方法也可以使用)
IProduct iProduct;
public void setIProduct(IProduct iProduct) {
this.iProduct = iProduct;
}
public void setMessage() {
this.iProduct.showMessage();
}
}
(四)里氏替换原则 LSP (Liskov Subsitution Principle)
public class LiskovSubsitutionPrinciple1 {
public static void main(String[] args) {
WeiXinAlgorithm weiXinAlgorithm = new WeiXinAlgorithm();
weiXinAlgorithm.oneAlgorithm();
}
}
class QQAlgorithm{
public void oneAlgorithm(){
System.out.println("一个不错的算法");
}
}
class WeiXinAlgorithm extends QQAlgorithm{
@Override
public void oneAlgorithm(){
System.out.println("算法稍微改改");
}
}
应用原则后(将原子类与原父类平级,共同继承基类):
public class LiskovSubsitutionPrinciple2 {
public static void main(String[] args) {
WeiXinAlgorithm weiXinAlgorithm = new WeiXinAlgorithm();
weiXinAlgorithm.oneAlgorithm();
}
}
class BaseAlgorithm{
// 写共同的基础的代码
}
class QQAlgorithm2 extends BaseAlgorithm{
public void oneAlgorithm(){
System.out.println("一个不错的算法");
}
}
class WeiXinAlgorithm2 extends BaseAlgorithm{
private QQAlgorithm2 qqAlgorithm2 = new QQAlgorithm2(); // 组合代替继承,耦合性降低
public void oneAlgorithm(){
qqAlgorithm2.oneAlgorithm();
// 继续改良
}
}
(五)开闭原则 OCP (Open Closed Principle)
package com.principle.openClosed;
public class OpenClosedPrinciple1 {
public static void main(String[] args) {
ShoppingList shoppingList = new ShoppingList();
shoppingList.addGood(new AddDesk());
shoppingList.addGood(new AddChair());
}
}
// 购物清单【使用方】
class ShoppingList{
public void addGood(AddGood addGood){
if(addGood.add_type == 1){
addOneDesk();
}else if(addGood.add_type == 2){
addOneChair();
}
// 再添加别的货物需要再添加判断
}
public void addOneDesk(){
System.out.println("添加一张桌子");
}
public void addOneChair(){
System.out.println("添加一把椅子");
}
// 再添加别的货物需要再添加方法
}
class AddGood {
int add_type;
}
class AddDesk extends AddGood {
public AddDesk() {
add_type = 1;
}
}
class AddChair extends AddGood {
public AddChair() {
add_type = 2;
}
}
应用原则后:
package com.principle.openClosed;
public class OpenClosedPrinciple2 {
public static void main(String[] args) {
ShoppingList2 shoppingList2 = new ShoppingList2();
shoppingList2.addGood(new AddDesk2());
shoppingList2.addGood(new AddChair2());
}
}
// 购物清单【使用方】
class ShoppingList2{
// 此时使用方不需要变动修改
public void addGood(AddGood2 addGood2){
addGood2.addGood();
}
}
abstract class AddGood2 {
abstract void addGood();
}
class AddDesk2 extends AddGood2 {
@Override
void addGood() {
System.out.println("添加一张桌子");
}
}
class AddChair2 extends AddGood2 {
@Override
void addGood() {
System.out.println("添加一把椅子");
}
}
思路:抽象类提供一个抽象方法,让子类去实现即可。
(六)迪米特法则 DP (Demeter Principle)
package com.principle.demeter;
import java.util.ArrayList;
import java.util.List;
public class DemeterPrinciple1 {
public static void main(String[] args) {
// 模拟打印清单
ShoppingList shoppingList = new ShoppingList();
shoppingList.addList();
new Machine().printShoppingList(shoppingList);
}
}
class Good{
int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
class ShoppingList{
private List<Good> goodList = new ArrayList<Good>();
public void addList() {
for(int i = 1; i < 10; i++){
Good good = new Good();
good.setId(i);
goodList.add(good);
}
}
public List<Good> getGoodList(){
return goodList;
}
}
class Machine{
// 收银机打印
public void printShoppingList(ShoppingList shoppingList){
// 这里Good类就是Machine类的陌生类(局部变量)
List<Good> goodList = shoppingList.getGoodList();
for(Good good : goodList){
System.out.println("商品" + good.getId());
}
}
}
应用原则后:
package com.principle.demeter;
import java.util.ArrayList;
import java.util.List;
public class DemeterPrinciple2 {
public static void main(String[] args) {
// 模拟打印清单
ShoppingList2 shoppingList2 = new ShoppingList2();
shoppingList2.addList();
new Machine2().printShoppingList(shoppingList2);
}
}
class Good2 {
int id;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
}
class ShoppingList2{
private List<Good2> goodList = new ArrayList<Good2>();
public void addList() {
for(int i = 1; i < 10; i++){
Good2 good2 = new Good2();
good2.setId(i);
goodList.add(good2);
}
}
public void printShoppingList(){
for(Good2 good2 : goodList){
System.out.println("商品" + good2.getId());
}
}
public List<Good2> getGoodList(){
return goodList;
}
}
class Machine2{
// 收银机打印
public void printShoppingList(ShoppingList2 shoppingList2){
// 直接把细节封装在ShoppingList2类中
shoppingList2.printShoppingList();
}
}
(七)合成复用原则 CRP(Composite Reuse Principle)
三、小结
单一职责:考虑这个类还能不能拆
接口隔离:接口实现类不需要接口的某些方法,则拆接口
依赖倒转:用抽象声明变量,具体留给调用方
里氏替换:将原子类与原父类平级,共同继承基类,现子类聚合/组合/依赖现父类
开放封闭:抽象代替变化,扩展代替修改
迪米特:局部变量无陌生类
合成复用:聚合/组合/依赖代替继承
最后
以上就是怕黑夕阳为你收集整理的【Java设计模式】设计目的以及七大原则一、设计目的三、小结的全部内容,希望文章能够帮你解决【Java设计模式】设计目的以及七大原则一、设计目的三、小结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复