设计一个扩展自抽象类geometricobject的新的triangle类_设计模式个人浅显理解

六大原则:

单一职责原则:

定义:一个接口只做一个职责的事情,接口的变化只应该由一种原因引起。

例子:一个用户,有基本信息,有角色信息,这种对象应该由2个接口定义,基本信息接口和角色信息接口

好处:易扩展,相互影响较小

接口隔离原则:

定义: 接口只应该做跟自己相关的事情,做到尽量小,跟单一职责的区别是,单一职责对同一相关的功能放到同一接口,接口隔离更细化了这一原则,就算是同一类相关的功能,还可以根据实际业务去拆分。

例子:一个用户,已经按照基本信息和角色信息分成2个接口,但是基本信息还可以分成家庭信息,工作信息等。

好处:隔离性好,易复用

迪米特原则:(最少知识原则)

定义:对象需要尽可能的隐藏自己的实现细节,只对外提供必要方法。2.对象中只依赖跟自己相关的其他对象。

例子:有接口A,B,C A中只跟B交互,B跟C交互,那么A接口中只应该依赖B,而不应该去依赖C。前提是接口都满足单一职责原则。

好处:解耦,易扩展,易复用

里氏替换原则:

定义:父类出现的地方子类都可以替换,就是说子类要实现父类的所有公共方法。不管任何地方都都是可以用子类去替换父类的

例子:多态的体现。 父类定义了3个方法,子类同样拥有相同签名的3个方法。

好处:易扩展,调用简单,解耦

依赖倒置原则:

定义:上层模板不应该依赖底层模块的具体实现。应该去依赖底层模块的抽象接口。接口不依赖细节,细节只依赖接口。

例子:DAO 应该有接口,Service只依赖DAO的接口,不去依赖他的具体实现。

好处:解耦,易扩展

开闭原则:

定义:对修改关闭,对扩展开放。如果要变更一个已经上线的程序,我们最好是通过扩展的方式来对这个对象变更。

例子,比如产品价格,一开始我们定义好了价格,后面需要打折出售,那我们不要去修改之前的价格,应该去定义一个打折类来扩展,获取到价格,然后打折,给出最终价格。

好处:不会影响之前的代码,比如打折只是针对vip,那么普通用户还是可以调用之前的方法,而vip可用调用打折方法获取最终定价

设计模式理解:

创建型模式(5个)

单例模式:

定义:确保一个类只有一个实例,并且自己初始化这个实例

a3c25196f0ec96f478ef1f9a0748d540.png

好处:一个实例比创建多个实例节约内存空间,单例的对象后面获取可直接用,节约创建时间

工厂方法模式:

定义:一个对象的创建用工厂类来做。

e61c1942d16e356d6f22709b42963ef9.png

实例:我需要一辆汽车,那么去工厂提供车辆名称,交钱就可以拥有了。对应的车及车的生产流程交给工厂。

实现:

1.定义汽车抽象类,

2.若干汽车实现类,

3.工厂类。

工厂类提供一个公共方法,根据产品名称创建具体产品,还可以默认初始化对象的信息。在客户端自己调用工厂类的公共方法传入产品名称就可以获取产品了。

好处:可以隐藏对象创建的细节。易扩展,新增产品时,只需要修改工厂类,对于客户端调用可以无感知。符合迪米特法则,依赖倒置法则,里氏替换法则。

抽象工厂模式:

定义:有多个相同步骤的产品。提供统一的接口来创建。

c0f405435985bbc2772b2ad56944f60d.png

实例:一个汽车工厂,需要生产不同配置的汽车。那一个配置的汽车所有配件就是一个抽象工厂

实现:

1.定义一个汽车配件抽象类定义配件名称,成本等,

2.多个配件的实现类。

3.再定义一个抽象工厂,提供所有配件的生产方法。

4.不同配置的配件整合成一个抽象工厂实现类。

一个抽象工厂的实现类就可以生产一个汽车的同一配置的所有配件。

好处:可以隐藏对象创建的细节。易扩展。另外还可以约束产品的创建步骤。新增配置只需要新增抽象工厂就可以了,客户端不需要太多修改。符合迪米特法则,依赖倒置法则,里氏替换法则。

建造者模式:

定义:产品的创建过程和产品的细节可以分离,同样的创建过程可以创建细节不同的产品。

706ac133dc1e0cfec97210aa3c620ad6.png

实例:有一个汽车DIV工厂,只要告诉他汽车的各个配件的型号,他就可以组装一辆新汽车。

实现:

1.一个汽车抽象类和实现类,描述汽车需要的配件,如,发动机,轮胎,车架等;

2.一个建造抽象类,定义汽车,汽车的配件表,汽车的构建过程

3.建造实现类,根据传入的配件表创建出汽车。

4.导演类,定义不同的配件表,传给建造类,得到汽车。

导演类定义一组常用的汽车配件表,传入到建造实现类中就可以生产出满足配件表的汽车了。

好处:封装性,解耦,调用简单,如果需要创建一个全新的汽车,导演类新增一个方法,更新配件表就可以了。

原型模式:

定义:创建对象通过拷贝定义好的原型。

49203cd0b55b78f49ade9ddf8db9b26d.png

实例:工厂方法中创建对象可以结合原型模式,通过clone的方式可以更快的创建出一个新的对象。

实现:java语言只要实现了Cloneable接口,复写clone方法就可以了


//原型模式通用源码
public class PrototypeClass implements Cloneable{
//覆写父类Object方法
@Override
public PrototypeClass clone(){
    PrototypeClass prototypeClass = null;
    try {
        prototypeClass = (PrototypeClass)super.clone();
    } catch (CloneNotSupportedException e) {
        //异常处理
    }
    return prototypeClass;
    }
}

好处:可以更快的创建一个新的对象。

注意事项:

1.拷贝不会执行对象的构造方法

2.只是浅拷贝了对象中的基本类型变量,对象中的引用变量需要再复写的clone方发中再拷贝

结构型模式(7个)

代理模式:

定义:为对象提供代理,以达到对对象访问的控制。

25ae75cc667a6bfae6cc844db7f16f50.png

实例:我要买车,我自己不会直接去工厂买,也不用去办理相关手续,4s店作为代理,我只跟4s点交互,我出钱拿车。车的相关手续都由4s店去处理。

实现:

1.汽车类

2. 代理类4s店,里面有汽车类

我直接去4s店代理类中获取到汽车,4s点会去工厂获取车后帮我办理手续再给我

好处:易扩展,代码复用,解耦合

动态代理:

动态代理就是写一个可以代理所有接口的代理类。代理的对象是动态创建的,AOP的实现原理

1.实现JDK提供的InvocationHandler接口,实现invoke方法,

2.再通过JDK提供的代理类Proxy来动态创建被代理的对象。

3.动态创建出来的代理类实际上会实现被代理的接口,并且继承Proxy类。

4.当调用被代理类的时候会通过写的动态代理类中的invoke方法去调用,那么我们就可以在invoke方法中实现方法调用前后的操作了。

动态代理类的实现代码:

ad30dd3bd2b6345c8d7359c1bb5d1104.png

未完待续,我会陆陆续续用自己的理解写完所有的设计模式。
不想续了。。。。。

参考:设计模式之禅

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
3. 几何图形(满分50分) 版本1:满分 10 分 设计抽象GeometricObject 及其子类 Triangle 和Circle。 GeometricObject设计要求如下: ■ 一个名为 color 的Color类型的私有数据域,表示对象的颜色 ■ 一个名为 filled 的Boolean类型的私有数据域,表示对象是否 ■ 一个名为 dateCreated 的Date 类型的私有数据域,表示对象的 ■ 一个无参构造方法。 ■ 一个能创建特定 color 和filled 的有参构造方法。 ■ 相关数据域的访问器和修改器。 ■ 两个个名为 draw 和erase的抽象方法。 ■ 一个名为 getArea的抽象方法。 ■ 一个名为 getPerimeter的抽象方法。 ■ 重写 toString 方法。 Triangle设计要求如下: ■ 三个名为 side1、side2和 side3 的double 类型的私有数据域表 们的默认值是 1.0。要求三个数据域保留 2 位小数。 ■ 一个无参的构造方法创建默认三角形。 ■ 一个能创建带指定 side1、side2和 side3 的有参构造方法。 ■ 所有三个数据域的访问器和修改器方法。 ■ 父类抽象方法的实现。 ■ 重写 toString 方法。 Circle 类设计要求如下: ■ 一个名为 radius 的double 类型的私有数据域,表示圆的半径,数据域保留2 位小数。 ■ 一个名为 PI 的静态常量,其值为 3.14 ■ 一个无参的构造方法创建默认三角形。 ■ 一个能创建带指定 radius 的有参构造方法。 ■ radius 数据域的访问器和修改器方法。 ■ 父类抽象方法的实现。 ■ 重写 toString 方法。 测试类 TestGeometricObject1 设计要求如下: ■ 一个能随机生成 Circle 类和Triangle 类对象的静态方法 GeometricObject[] RandomCreateGeometricObject() ■ 以随机生成的数组为参数,输出数组中每个对象的基本信息、周长和面积。 ■ 类中其它方法的测试 版本2:满分 20 分 将上面的抽象GeometricObject 改为接口,接口只保留其中四个抽象方法,声明类 Circle、Triangle 实现该接口,类的基本要求如上,同时为每个类增加一个将当前对象序列化 到指定文件的方法 writeToFile(File f)。 测试类 TestGeometricObject2 设计要求如下: ■ 一个能随机生成 Circle 类和Triangle 类对象的静态方法,该方法将随机生成的象序列 化到指定的文件 GeometricObjects.dat 中,序列化成功返回真,否则返回假。 Boolean RandomCreateGeometricObject() ■ 将GeometricObjects.dat 文件中对象全部读出,存储到 GeometricObject 对象数组中, 然后以此数组为参数,输出数组中每个对象的基本信息、周长和面积。 ■ 类中其它方法的测试。 增一个类Rectangle ,也实现接口 GeometricObject ,同时修改测试类 TestGeometricObject2 ,体会开-闭原则。 版本3:满分 20 分 在第2 步的基础上设计实现一个具有 GUI 界面的几何图形绘制系统系统,要求实现根 据选择的几何图形类型来绘制和删除相应的图形,其中相关参数应通过界面输入,并可计算 图形的周长和面积。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值