java设计模式学习随笔

设计模式入门
	1:设计模式是人们在面对同类型软件工程设计问题所总结出的一些有用经验。模式不是代码,而是某类问题的通用设计解决方案。
	2:怎么来的,前人总结的
	3:设计模式的邮件和用途
	4:学习设计模式的方式:在你的设计和以往的工程里寻找何处可以使用它们
	5:学习设计模式的本质目的是使软件工程在维护性、拓展性、变化性、复杂度方面称0(N)
	6:OO原则,设计模式是具体方法、工具

策略模式:
	定义:分别封装行为为接口,实现算法族,超类里放行为接口对象,在子类里具体设定行为对象。原则就是:分离变化部分,封住接口,基于接口编程各种功能。该模式让行为算法的变化独立于算法的使用者。
	ps自我理解:
		1:从原始的OO角度设计,抽象出对象的共性,提取至基类
			public abstract class Duck {
				public void Quack() {
					System.out.println("~~gaga~~");
				}
				public abstract void display();
				public void swim() {
					System.out.println("~~im swim~~");
				}
			}
		2:相应的各个实现类只需要继承基类就可以使用到基类里面有的方法和重写自己想要的方法
			public class GreenHeadDuck extends Duck {
				@Override
				public void display() {
					System.out.println("**GreenHead**");
				}
			}
		3:后来来了新需求
			应对新的需求,看看这个设计的可扩展性
			添加会飞的鸭子

		4:OO思维里的继承方式解决方案是:
			public abstract class Duck {
					...;
					public void Fly() {
					System.out.println("~~im fly~~");
				}
			};
			问题来了,这个Fly让所有子类都会飞了,这是不科学的。
			继承的问题:对类的局部改动,尤其超类的局部改动,会影响其他部分。影响会有溢出效应
		5:为了正确性那么你是不是需要去重写所有的实现,这次是所有的鸭子都会飞,下次再来个所有的鸭子都会上树了你咋办?
			超类挖的一个坑,每个子类都要来填,增加工作量,复杂度O(N^2)。不是好的设计方式

		6:用策略模式来新需求解决
			//行为接口
			 public interface FlyBehavior {
				void fly();
			}	

			 //基类
			public abstract class Duck {	  //基类
				FlyBehavior mFlyBehavior;      //行为接口对象   也就是容易变化的地方
				QuackBehavior mQuackBehavior;  //行为接口对象
				public Duck() {	}
				public void Fly() {
					mFlyBehavior.fly(); //行为接口对象的方法 不做具体实现
				}
				public void Quack() {
					mQuackBehavior.quack();
				}
				public abstract void display();  //共同的地方也就不需要再做什么手脚了 没啥意义

				public void SetQuackBehavoir(QuackBehavior qb) {
					mQuackBehavior = qb;
				}

				public void SetFlyBehavoir(FlyBehavior fb) {
					mFlyBehavior = fb;
				}

				public void swim() {
					System.out.println("~~im swim~~");
				}
			}

			 //行为接口实现
			 public class	BadFlyBehavior implements FlyBehavior
			{
				@Override
				public void fly() {
					// TODO Auto-generated method stub
					System.out.println("--BadFly--");
				}
			}		 

			//基类的具体实现类
			public class GreenHeadDuck extends Duck {
				public GreenHeadDuck() {
					mFlyBehavior = new GoodFlyBehavior();
					mQuackBehavior = new GaGaQuackBehavior();
				}

				@Override
				public void display() {
					// TODO Auto-generated method stub
					System.out.println("**GreenHead**");
				}
			}

	策略模式总结:
		1:分析项目中变化和不变化的部分。
		2:多用组合少用继承,用行为类组合,也不是行为的继承。更有弹性。

装饰者模式:
	装饰者模式原理:
		1:装饰者模式就像打包一个快递
			1)主体:陶瓷、衣服
			2)包装:报纸、套末班、纸板
		2:Component:主体(超类)
		3:ConcreteComponent(具体实现类)和Decortor(实现类的装饰)
		4:装饰者模式:
			动态的将新功能附加到对象上。在对象功能扩展方面,它比继承更有弹性。

单例模式:
	经典单例模式原理:
		单例模式的意义:
			有些对象我们只需要一个:线程池、缓存、硬件设备等,如果多个实例会造成冲突、结果的不一致性等问题。
			是否可以用静态变量方式来实现?
			或者协商一个全局变量?
		单例模式的概念:
			确保一个类最多只有一个实例,并提供一个全局访问点。
		单例模式类图:
			-----------------------
			|	    Singleton     |
			-----------------------
			|static uniqueInstance|   //静态变量
			|//其他               |
			-----------------------
			|private Singletom()  |   //构造函数私有 封闭类在外部new的方式
			|static  getInstance  |   //在类的内部使用静态函数构造一个对象
			|//其他               |
			-----------------------

	经典单例模式代码示例:
		单例类java代码:
			public class Singleton{
				private static Singleton  uniqueInstance = null;  //用于存放自己的实例
				private Singleton(){};							  //构造函数私有
				public static Singletom getInstance(){
					if(null == uniqueInstance){
						uniqueInstance = new Singleton();
					}
					return uniqueInstance;
				}
			}

	经典代理模式代码优化:
		多线程问题:会出现两个或多个线程获取到两个或多个不同的对象。

			优化方式1:创建方法枷锁
				public class Singleton{
					private static Singleton  uniqueInstance = null;     //用于存放自己的实例
					private Singleton(){};							     //构造函数私有
					public static synchronized Singletom getInstance(){  //最粗暴的方式 synchronized会多次
						if(null == uniqueInstance){
							uniqueInstance = new Singleton();
						}
						return uniqueInstance;
					}
				}
			优化方式2:‘急切’创建实例
				public class Singleton{
					private static Singleton  uniqueInstance = new Singleton();  //用于存放自己的实例 程序启动时就创建好对象
					private Singleton(){};							  //构造函数私有
					public static Singletom getInstance(){
						if(null == uniqueInstance){
							uniqueInstance = new Singleton();
						}
						return uniqueInstance;
					}
				}
			优化方式3:双重检查加锁
				public class Singleton{
					private static volatile Singleton  uniqueInstance = null;  //用于存放自己的实例
					private Singleton(){};							  //构造函数私有
					public static Singletom getInstance(){
						if(null == uniqueInstance){
							synchronized (Singleton.class){           //这样也就是再上面内个方法的基础上 优化了加锁的次数  只会有一次 synchronized
								if(null == uniqueInstance){
									uniqueInstance = new Singleton();
								}
							}
						}
						return uniqueInstance;
					}
				}

工厂模式:
	简单工厂模式的设计方案:
		定义一个实例化对象的类,由这个类封装创建对象的行为。

	工厂方法模式的设计方案:
		将对象的实例化功能抽象成抽象方法,在不同实例里面实现具体功能,
		也就是定义一个创建对象的抽象方法,由子类决定要实例化的类。工厂方法模式将对象实例化推迟到子类。

	抽象工厂模式定义:
		定义一个接口用于创建相关有依赖关系的对象族,而无需指明具体类。

	工厂模式关键点:
		1:工厂模式的意义
			将对象实例化动作提取,和项目的主动和依赖进行解耦
		2:三种工厂模式

		3:依赖抽象原则
			变量不要持有具体类的引用,不可以强依赖
			不要让类继承自具体类,要继承自抽象类或接口
			不要覆盖基类中已经实现的方法

适配器模式:
	原理:将一个类的接口转换成另一种接口,让原本接口不兼容的类可以兼容。

		目标 <--- 适配器 <--- 被适配者 

		从用户角度看不到被适配者,是解耦的
		用户调用适配器转换出来的目标接口方法
		适配器再调用被适配者的相关接口方法

	对象适配器与类适配器:
		类适配器:通过多重继承目标接口和被适配者类方式来实现适配

				目标<--|
					   |适配器
			被适配者<--|

			多重继承,其中继承的目标接口部门达到适配目的,而继承被适配者类的部分达到通过调用适配者类里面的方法实现目标接口的功能

		对象适配器与类适配器的差异:
			对象适配器与类适配器使用了不同的方法实现适配,对象适配器使用组合,类适配器使用继承

  

原文地址:https://www.cnblogs.com/kangrui/p/9662147.html

时间: 2024-11-01 14:38:09

java设计模式学习随笔的相关文章

Java设计模式学习记录-桥接模式

前言 这次介绍结构型设计模式中的第二种模式,桥接模式. 使用桥接模式的目的就是为了解耦,松散的耦合更利于扩展,但是会增加相应的代码量和设计难度. 桥接模式 桥接模式是为了将抽象化与实现化解耦,让二者可以独立地变化.方便对每一部分的扩展,以及单独的维护.抽象化的一方与实现化的一方之间建立一个桥梁,这样两者的依赖关系就可以通过这个桥梁来建立了. 举例 三个小动物要过河,分别是小猪,小鸡,小马,小猪要去河对面的空地晒太阳,小鸡要去河对面的小树林里找虫子吃,小马要去河对面的草地里吃草.那么它们三个都要经

Java设计模式学习记录-装饰模式

前言 装饰模式也是一种结构型模式,主要是目的是相对于类与类之间的继承关系来说,使用装饰模式可以降低耦合度.JDK中有不少地方都使用到了装饰模式,例如Java的各种I/O流,javax.swing包中一些图形界面构件功能的增强等地方都运用了装饰模式. 装饰模式 定义 装饰模式的定义是:在不改变原类文件以及不使用继承的情况下,动态的扩展一个对象的功能.装饰模式是通过创建一个包装对象来实现的,也就是用装饰来包裹真实的对象. 举例 还是老规矩,举例说明,在给亲朋好友过生日时会买生日蛋糕,然后生日蛋糕又有

Java设计模式学习记录-迭代器模式

前言 这次要介绍的是迭代器模式,也是一种行为模式.我现在觉得写博客有点应付了,前阵子一天一篇,感觉这样其实有点没理解透彻就写下来了,而且写完后自己也没有多看几遍,上次在面试的时候被问到java中的I/O的各种实现用到了什么设计模式,我愣是想半天没想出来了,人家还给提示了我也没想出来,最后还是面试官给出的答案,是装饰模式,听到答案后就恍然大悟了,前两天刚看了装饰模式,还写下了I/O操作中的各种类都是用到了装饰模式,后来想想两方面原因造成的当时没回答出来,一是面试时紧张就容易想不起来,二是对设计模式

Java设计模式学习记录-状态模式

前言 状态模式是一种行为模式,用于解决系统中复杂的对象状态转换以及各个状态下的封装等问题.状态模式是将一个对象的状态从该对象中分离出来,封装到专门的状态类中,使得对象的状态可以灵活多变.这样在客户端使用时无需关心对象的状态,可以实现自身的一致性处理.最近工作有些忙,更新博客慢了.还是要严格要求自己的,抽时间也要坚持学习. 状态模式 概念介绍 状态模式允许一个对象在其状态改变时,改变它的行为,对象看起来似乎修改了它的类. 想要在改变自身状态时改变对象行为,最直接的方法就是在代码中将所有可能发生的情

Java设计模式学习笔记,一:单例模式

开始学习Java的设计模式,因为做了很多年C语言,所以语言基础的学习很快,但是面向过程向面向对象的编程思想的转变还是需要耗费很多的代码量的.所有希望通过设计模式的学习,能更深入的学习. 把学习过程中的笔记,记录下来,只记干货. 第一部分:单例模式的内容 单例模式:类只能有一个实例. 类的特点:1.私有构造器:2.内部构造实例对象:3.对外提供获取唯一实例的public方法. 常见的单例模式实现有五种形式: 1.饿汉式. 2.懒汉式. 3.双重检查锁式. 4.静态内部类式. 5.枚举式. 以下分别

java 设计模式学习

设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样.项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周

java设计模式学习 ----- 单例模式(Singleton)

单例模式(Singleton) 单例对象(Singleton)是一种经常使用的设计模式. 在Java应用中,单例对象能保证在一个JVM中,该对象仅仅有一个实例存在.单例模式也分三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有几个长处: 1.某些类创建比較频繁,对于一些大型的对象,这是一笔非常大的系统开销. 2.省去了new操作符,减少了系统内存的使用频率,减轻GC压力. 3.有些类如交易所的核心交易引擎.控制着交易流程,假设该类能够创建多个的话,系统全然乱了.(比方一个军队出现了多个司令员

Java设计模式学习记录-简单工厂模式、工厂方法模式

前言 之前介绍了设计模式的原则和分类等概述.今天开启设计模式的学习,首先要介绍的就是工厂模式,在介绍工厂模式前会先介绍一下简单工厂模式,这样由浅入深来介绍. 简单工厂模式 做法:创建一个工厂(方法或类)用来制造对象. 当一个人想要用手机的时候,需要自己创建手机然后来使用. 如下: public class IphoneX { public IphoneX(){ System.out.println("##### 制造iphoneX #####"); } } public class I

设计模式学习随笔

策略模式随笔 设计模式是解决某些问题的通用解决方案:这些模式不是代码而是一种类似经验的方法. 设计模式中最好的方法就是实践中尝试套用这些模式,让以后的程序在使用中变的更加容易维护,扩展,变化,复杂. OO是设计原则,设计模式是具体的方法和工具. 策略模式的原理: 模拟鸭子的游戏: 面向对象中设计这个鸭子的超类和扩展类: public abstract class Duck{ public Duck(){ } public void Quack(){ System.out.println("~~g