Java学习打卡第九天【Java养成】
内容导航
Java入门到精通(打卡第九天)
学习内容
设计模式的简单介绍
内容管理
设计模式的基本介绍
设计模式提供了用面向对象的思想设计不同的系统、不同应用时经常发生的问题的解决方案,给programmer提供了解决问题的方法蓝图,也就i是它给我们提供了优化我们的设计与代码的思路和依据,精选的设计模式有23个
每个设计模式由以下部分组成(A design pattern description consists of:)
- A name that identifies the pattern 就是每个设计模式都有一个可识别的名称
- A description of the problelm that the pattern addresses 对于模式所强调问题的介绍
- A description of the solution that includes the class structures that solve the problem.对于包括可解决该问题的类结构的解决方法的描述
- A discussion of the consequences(后果,价值) of using the pattern. 讨论使用这个模式的优缺点 3
面向对象设计原则
- 找出应用可能出现变换之处,把变换的地方封装起来,不要和那些无需变换的混在一起(接口,继承),-------可以使代码变化引起的不经意后果变少,系统更有弹性
- 针对接口编程(超类型),多使用继承和多态-----简洁
- 多用关联,少使用继承----如果所有的对象都可以当作一个基类对象来使用,那我们就倾向于接口编程
- 类应该对修改关闭,对扩展开放,不允许修改的条件下扩展功能
我们接下来介绍一下单一设计模式以及策略模式
Singleton Pattern(单一实例模式)
应用场景
- 很多时候都需要保证一个类中只有一个实例(这句话的意思是这个类的对象(实例)是单一的,不具有多样性) such as 希望整个应用程序中只有一个连接数据库的Connection 实例,也就是该类就只有一个实例、操作系统只需要一个是时钟、对于与建模固定信息不变得类,仅仅需要访问一个实例,这里一定要注意区分单一实例的类和对象(实例)
- 一个类有属性信息,但是其所有的属性信息的值都是唯一的,只能访问,不能修改,可以使用singleton pattern
- 一个类没有属性信息,只有方法,可以使用单一实例模式
那我们怎么保证一个类中只有一个易于被使用的实例呢?
- The singleton pattern ensures that only one instance(实例) of a class is created and provides a method to access that one instance.就是要提供一个方法去调用那个实例
构造函数必须是private 私有的
首先这个类的构造函数必须是private,私有的,如果是public,那么programme就会可以调用多次构造函数构造多个实例,那我们知道private方法只能本类中使用,那怎么创建对象,这里我们就使用一个静态的方法来返回这个创建的实例 return new Point2D(1,2);
那我岂不是还是可以多次调用这个方法然后创建多个对象,那怎么做,那就使用一个检测变量,初始化为null,调用后就不是null了,这个时候就不能调用该方法了,UML类图下划线就代表该方法或属性是静态的。这个检测变量直接设置成接受实例的变量就好了。
public class Connection {//这是一个测试类,演示单一设计模式
static int size; //接口的大小,类只有一个实例,不需要多样化,直接变成类属性
static int address; //接口的地址;只是模拟的属性
static int monitor = 0;//创建之后大于0,不能创建实例;这种显得不那么简洁,不需要这样子
private Connection(int size, int address) {//构造方法是私有的,只能本类操作,外部不可随意创建对象
super();
Connection.size = size;//可以使用this会warning,但静态属性用类引用最好
Connection.address = address;
}
public static Connection getConnnectionInstance()
{
if(monitor++ == 0)
return new Connection(1,35898);
return null;
}
}
//我们直接用一个记录对象的singleton实现就可以了,它有一个对象值就不可以创建了
public class Connection {
static int size;
static int address;
static Connection singleton;
private Connection() {
super();
size = 1;
address = 877664;
}
public static Connection getConnnectionInstance()
{
if(singleton == null)//这个对象变量实现功能
{
singleton = new Connection();
}
return singleton;
}
public int getAddress()
{
return address;
}
public int getSize()//还有非静态方法
{
return size;
}
}
其实静态方法是属于类的,所以单一实例模式使用静态方法和属性及加上创建变量的限制就可以创建一个实例对象,我们通过F5调试的时候就可以进入Java的API里面,可以进行源码的查看。
再总结一下
- The constructor(构造函数) is defined as private so that other classes cannot create instances(实例)
- The static attribute(属性) instance contains the single instance of the class
- The static method getSingletonInstance() returns the single instance of the class.(The first time the method is called, it’s creates the single instance) We need a static variable(变量) to implememt(实现) this function.
Consequences(后果)优缺点
- 它的好处是可以控制用户只能创建一个单一的对象、
- 它很容易扩展,比如控制只创建3个对象,那么加一个计数器就好
节省内存,提高效率,这里总结就是该模式要将构造方法私有化,创建对象使用一个返回值类型为类类型的方法创建对象,方法为静态的,就是可以直接用类来调用
Strategy Pattern(策略模式)
这里我们先来用一个例子来引入这个模式:比如我们现在的图书管理系统需要显示借阅者信息一共三种方式:plain text,HTML, XML. If the rules to display the information are complex, the method will be long and complex.增加新的算法或改变原有算法都会非常困难。
(因为我们是在同一个方法体里进行操作的)万一出错,调试太困难了
策略模式就可以解决这个问题
A solution that uses the strategy pattern. The complexity of displaying the information code is reduced by separating(分解) it into three classes
也就是我们将我们的三种方式拆分成三个类,而不是在一个类中实现,但是我们发现这三种方式的功能都是一样的,所以我们这里就声明方法formatBorrowers()的接口BorrowersFormat
Interface BorrowersFormatter
class PlainTextBorrowersFormatter
class HTMLBorrowersFormatter
class XMLBorrowersFormatter//三种方式实现接口
**策略模式就是将不同的策略,不同的方式封装在不同的类中,面向接口编程。**也就是多态的一种实现
这里我们的接口没有属性,只有一种方法就是display method,所以这里就可以使用我们上面的单一实例模式来设计几个子类。
Consequences(后果)优缺点
- 所写的代码大部分都是面向接口编程,所以可以轻易扩展新类,大部分代码不受影响,设设计易于维护
- 整个strategy的核心就是接口的运用,将不同的方式直接用接口来实现,所以该模式可以在用户需要变化时,修改量很小,快速
应用场景举例
- Save files in different formats. 用不同的格式保存文件
- Compress files using different algorithms 用不同的方式压缩文件
- Capture video data using different compression schemes
- Use different line-breaking strategies to display text data
- Plot the same data in different formats: line graph ,bar chart or pie chart
所以应用场景就是different,实现类似的功能时,我们就要设计接口来实现
应用案例-----Java界面布局
Java的界面搭建框架支持容器中的组件采用不同的布局进行摆放,需要设计一个灵活的容器布局策略,以使适应新的布局加入到该系统
每个容器都可以指定一个布局管理器,当容器需要对某个组件进行定位或判断其大小尺寸时,就会调用对应的布局管理器
Java语言就采用的策略模式,提供了布局管理器接口LayoutManager 来管理组件在容器中的布局
具体的布局算法分别封装在一个实现布局管理的类中,容器可以在运行时刻使用不同的布局管理器{其实我们昨天所讲的迭代器也使用了策略模式}
borderLayout
FlowLayout
GirdLayout
今天的分享就到这里了,我们可以直接去Java的API 里阅读页面布局的源码或者其他接口的源码,这对于我们的规范编程有莫大的帮助
设计模式还有其他很多种,在面试的时候如果问到让举例时,在生活中的例子和程序中的例子都要能够想到,下次有机会就会继续分享设计模式的~~