大话设计模式

来源:互联网 发布:詹姆斯vs杜兰特数据 编辑:程序博客网 时间:2024/05/22 13:07

第一章   简单工厂模式——代码无错就是优

实例:计算机控制程序(if与switch的效率问题)

印刷术——活字印刷术:可维护,可复用,可扩展,灵活性好。

 

面向对象的好处:通过封装、继承、多态把程序的耦合度降低。

业务的封装:业务逻辑与界面逻辑分开,让它们之间的耦合度下降。

 

聚合关系:聚合表示一种弱的“拥有”关系,体现的是A对象可以包含B对象,但B对象不是A对象的一部分。(雁群和大雁)

合成关系:合成表示一种强的“拥有”关系,体现了严格的部分和整体的关系,部分和整体的生命周期一样。(鸟和翅膀)

多态

public abstract class Human{    ...    public abstract void goPee();}


我们定义了一个被称为"人类"的抽象基类."去撒尿"这个方法是抽象的,因为对于整个人类来说没有一个统一的撒尿方法.只有当你具体地讨论这个人是男人还是女人的时候,"撒尿"这个方法才有具体的含义.与此同时,"人类"也是一个抽象的概念-不可能有一个既不是男人也不是女人的"人类"存在.当我们讨论一个人的时候,TA要么是个男人,要么是个女人.

public class Male extends Human{    ...    @Override    public void goPee()    {        System.out.println("Stand Up");    }}public class Female extends Human{    ...    @Override    public void goPee()    {        System.out.println("Sit Down");    }}

现在我们有了更具体的关于男人和女人的类定义:男人站着撒尿,.他们都是人类的继承类,但是他们有不同的撒尿方法.

多态最完美的展现在于当我们试图让一屋子的人都去撒尿的时候:


public static void main(String args){    ArrayList<Human> group = new ArrayList<Human>();    group.add(new Male());    group.add(new Female());    // ... add more...    // tell the class to take a pee break    for (Human person : group)    {        person.goPee();    }}

得到的结果是

Stand UpSit DownSit DownStand UpStand Up...

简单工厂模式


实现

我们将创建一个 Shape 接口和实现 Shape 接口的实体类。下一步是定义工厂类 ShapeFactory。
FactoryPatternDemo,我们的演示类使用 ShapeFactory 来获取 Shape 对象。它将向 ShapeFactory 传递信息(CIRCLE / RECTANGLE / SQUARE),以便获取它所需对象的类型。

步骤 1:创建一个接口

public interface Shape {   void draw();}

步骤 2:创建实现接口的实体类

public class Rectangle implements Shape {   @Override   public void draw() {      System.out.println("Inside Rectangle::draw() method.");   }}public class Square implements Shape {   @Override   public void draw() {      System.out.println("Inside Square::draw() method.");   }}public class Circle implements Shape {   @Override   public void draw() {      System.out.println("Inside Circle::draw() method.");   }}

步骤 3:创建一个工厂,生成基于给定信息的实体类的对象。

public class ShapeFactory {   //使用 getShape 方法获取形状类型的对象   public Shape getShape(String shapeType){      if(shapeType == null){         return null;      }      if(shapeType.equalsIgnoreCase("CIRCLE")){         return new Circle();      } else if(shapeType.equalsIgnoreCase("RECTANGLE")){         return new Rectangle();      } else if(shapeType.equalsIgnoreCase("SQUARE")){         return new Square();      }      return null;   }}

步骤4:使用该工厂,通过传递类型信息来获取实体类的对象。

public class FactoryPatternDemo {   public static void main(String[] args) {      ShapeFactory shapeFactory = new ShapeFactory();      //获取 Circle 的对象,并调用它的 draw 方法      Shape shape1 = shapeFactory.getShape("CIRCLE");      //调用 Circle 的 draw 方法      shape1.draw();      //获取 Rectangle 的对象,并调用它的 draw 方法      Shape shape2 = shapeFactory.getShape("RECTANGLE");      //调用 Rectangle 的 draw 方法      shape2.draw();      //获取 Square 的对象,并调用它的 draw 方法      Shape shape3 = shapeFactory.getShape("SQUARE");      //调用 Square 的 draw 方法      shape3.draw();   }}

步骤 5:验证输出

Inside Circle::draw() method.Inside Rectangle::draw() method.Inside Square::draw() method.

第二章 策略模式——商场促销


实例:商场收银软件

面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类。




0 0