1. 类
每一个类其实就是这样一个声明:这些逻辑应该放在一起,它们的变化不像它们所操作的数据那么频繁;这些数据也应该放在一起,它们的变化频率差不多,并且由与之关联的逻辑来处理。因为一般数据的变化要比逻辑频繁得多,类的主要目的就是把逻辑与数据分离开来。学会如何用类来包装逻辑和如何表达逻辑的变化,这是有效使用对象编程的重要部分。
2.简单的超类名
找到一个贴切的名字是编程中最令人开心的时刻之一。在所有的命名中,类的名字最重要。类是维系其他概念的核心。一旦类有了名字,其中操作的名字也就顺理成章了。为了给一个类取一个简洁又有变现力的名字,需要给这个类要计算的逻辑找到一个强有力的隐喻。比如一个画图类DrawingObject,然后看到这个绘图对象的效果是画出来了一个图形(Figure)。于是这个画图类改成了名字Figure比原来那个名字更简洁也更有变现力。
3.限定性的子类名
子类的名字有两个重要职责,a.描述这些类像什么,b.他们之间的区别是什么。子类的命名应该尽量把这两个职责体现出来。
与他人沟通是类名的用途,如果仅仅只是为了跟计算机沟通,只要给每个类编号就足够了。如果一组类的名字体现不出它们之间的相关性,阅读者就很难对它们形成整体印象,也很难回忆起它们的关系。应该用类名来讲叙代码的故事。
4.接口与抽象类
在选择超类的时候,是选择接口还是选择抽象类取决于你今后是否需要对超类进行修改。如果非常有可能进行修改,那么使用抽象类,抽象类里面可以添加一个方法实现,所有继承于这个抽象类的类都能调用这个方法。而如果是接口的话,接口里面只能声明这个方法,那么所有实现这个接口的类都得去实现这个方法,非常的麻烦。但是如果超类定义之后不太可能修改,就可以用接口。(关键是看日后修改的难易程度,即使是日后很有可能修改,但是这个接口确定就只有一个实现类,也可以用接口的。)
5.值对象
java中有2种主要对象:
实体:在时间上有连续性,并且有唯一标识可以来区分的对象。
值对象:用来描述事物的,不区分谁是谁的,不可变的对象。
判断一个对象是实体还是值对象,还要根据它在具体的业务领域中的实际意义来决定,比如:
体育馆里的座位,当业务领域这样规定,一张门票对应一个特定的座位,即每个座位都应该严格区分谁是谁,观众在选择座位时根据门票对应的座位号来选择这个唯一的座位,此时座位对象应该为实体。
但当业务领域改变规则,决定只要有门票,就可以进去随便坐,此时不需要明确哪个座位是哪个座位,只要有座位就可以坐下,每个座位都是同一个座位对象的副本(在某些场合可以通过共享一个对象来提高性能),无须区分谁是谁,此时座位对象应该为值对象。
我们的程序在构建一个类的时候需要将“状态需要发生变化”与“对象不能变化”这两部分区分开来,分成不同类来对待,比如java里面的String类型是值对象。
6. 委派
要实现实例特有的行为,if/then和switch语句是最简单的方式。但是这样的做法是边判断边做处理。判断与处理混在一起,今后修改起来比较麻烦。还有一种实现方式叫做委派,先在外面进行判断,判断完了之后,传进来一个对象,调用这个对象的方法进行处理。这样就把判断与处理分开了,今后修改起来也方便。一个委派的例子:
public interface Idelegate {
public void test();
}
public class DelegateA implements Idelegate {
public void test() {
System.out.println("test A");
}
}
public class DelegateB implements Idelegate {
public void test() {
System.out.println("test B");
}
}
public class Delegate {
private Idelegate idelegate;
public Delegate(Idelegate idelegate) {
this.idelegate = idelegate;
}
public void test () {
idelegate.test();
}
}
public class TestMain {
public static void main(String[] args) {
Delegate d = new Delegate(new DelegateA());
d.test();
Delegate d2 = new Delegate(new DelegateB());
d2.test();
}
}
TestMain里面构造Delegate的时候传进去的参数是先做判断出来的结果,这个判断一般是一个方法,根据判断结果创建对应的实现类。
分享到:
相关推荐
通过分析这些代码,我们可以看到如何在实际项目中运用桥梁模式,例如,如何定义抽象接口,如何创建实现接口的类,以及如何在具体抽象类中通过接口引用实现类的方法。 桥梁模式的应用场景广泛,例如在图形用户界面...
本篇将深入探讨工厂模式在Java中的实现以及类设计图的应用。 首先,我们来看简单工厂模式。它是一种静态工厂,通常包含一个静态方法,用于根据输入参数返回所需类型的实例。简单工厂模式的优点在于易于使用,但缺点...
在这个Java实现中,我们将深入探讨适配器模式的两大类型:类适配器模式和对象适配器模式,并通过具体的代码示例和UML类图来阐述其工作原理。 首先,我们来理解适配器模式的基本概念。适配器模式就像现实生活中的...
UML类设计图会清晰地展示出这些类之间的关系,包括类的继承、接口的实现以及方法的调用。在Java中,你可以使用`abstract`类来定义组件,然后让叶子节点和组合节点分别继承这个抽象类。同时,接口也可以用来确保所有...
构建模式(Builder Pattern)是设计模式中的一种结构型模式,主要解决复杂对象的创建问题,通过将构造过程逐步分解,使得构造过程...UML类设计图则直观地展示了这些类和接口的关系,帮助我们更好地理解和使用这个模式。
装饰者模式通过将对象包装在一个装饰器类中来实现这个目标,装饰器类实现了与被装饰对象相同的接口,可以添加新的方法或重写已有的方法。 在Java中,装饰者模式通常包含组件接口、具体组件(ConcreteComponent)、...
在Java中实现原型模式,首先需要让原型类实现`Cloneable`接口,并重写`clone()`方法。以下是一个简单的示例: ```java public class Prototype implements Cloneable { private String property; public ...
标题中的“设计模式之装饰模式Java实现”指的是使用Java语言来实现装饰模式。装饰模式的核心思想是通过将对象包装在一个装饰类中,动态地给对象增加新的功能,而不是通过改变原有类的代码。这样可以保持原类的简洁性...
类适配器模式通过继承目标接口和适配者类来实现,而对象适配器模式则是通过组合适配者类来实现。适配器模式常用于旧系统改造或者第三方库的接口调整,它降低了系统的耦合度,增加了系统的灵活性。 以一个具体的例子...
在Java中实现解释器模式,我们可以创建一个抽象表达式接口,然后为每种特定的语法结构创建一个具体表达式类。这个模式在处理简单的语言或表达式时特别有用,例如配置文件、简单的计算器或者SQL查询的简化版本。 ...
这种模式将子系统的复杂性隐藏起来,使得客户端不必了解子系统内部的详细实现,从而降低了系统的耦合度。 在Java中,我们可以用以下方式实现门面模式: 1. **定义子系统接口**: 首先,我们需要定义子系统中的...
在设计图中,单例模式会显示一个类(Singleton)和一个指向该类的静态引用,而装饰模式则会展示组件、装饰器和它们之间的继承关系。 通过熟练掌握并应用单例模式和装饰模式,开发者可以在保证代码可读性、可维护性...
- 当有多个类实现相同算法,但实现步骤略有不同时,可以通过模板方法模式统一算法框架,让每个类只关注自己独特的部分。 - 在代码库中,如果存在一些通用的算法,但其中某些步骤可能需要根据实际情况变化,模板方法...
它具有多种设置图像显示方式的方法,其中之一就是填充模式。本文将深入探讨ImageView的图片填充模式,特别是"CenterCrop"模式,并教你如何实现这一效果。 首先,我们需要理解ImageView的几种基本填充模式: 1. `...
在Java中,观察者模式通常通过Java内置的`java.util.Observable`类和`java.util.Observer`接口来实现。`Observable`类代表被观察的对象,它可以有多个观察者,而`Observer`接口则定义了观察者的通用行为。 首先,...
Adapter模式是一种设计模式,主要目的是解决不同接口之间不兼容的问题,使得原本无法协同工作的类能够协同工作。在本文中,我们通过一个形如"形状"的范例来讲解Adapter模式的概念和实现。 首先,我们有一个抽象基类...
java设计模式之多例(Multiton)模式是对象的创建模式之一,多例模式中的多例类可以有多个实例,且多例类必须自己创建、管理自己的实例,并向外界提供自己的实例。多例模式的特点是:多例类可以有多个实例,多例类必须...
然后,分别为每种电器创建对应的命令类,如LightCommand、FanCommand和DoorCommand,这些命令类实现了Command接口。在命令类中,它们持有对应的电器对象,并在Execute方法中调用电器的方法执行操作,在Undo方法中...
在.NET环境下,通过接口和抽象类,我们可以轻松地实现代理模式,使得系统设计更加优雅和高效。 总结一下,代理模式是一种强大的设计模式,它允许我们在不修改原有对象的情况下,通过代理对象添加额外的功能。在.NET...
理解并合理运用代理模式,可以提高代码的可维护性和可扩展性,是成为一名优秀的程序员必备的技能之一。在实际开发过程中,我们应该根据具体需求选择适合的代理类型,并灵活运用,以提升系统的整体性能和用户体验。