IT彭于晏带你学JAVA之设计模式,接口

1.单例模式

*单例设计模式(思想)
 *核心思想:在程序的运行当中 该类的对象 不管怎么创建 始终保持 有且只有一个该类的对象
 *
 *听歌
 *听歌(网易 QQ音乐 虾米 )
 *不管你是  前台播放 后台播放 使用的都是一个播放器
 *单例可以进行 传值
 *
 *编写单例思路
 *1.不让外界创建对象(私有化构造方法)
 *2.自己类内部 创建这个对象(让对象只创建一次)
 *3.给内外 提供一个获取该对象的方法(相当于提供一个get方法)
 *
 *
 *如何编写单例类
 *1.饿汉式(只要该类被加载 就会在方法区静态区中 创建本类对象)
 *2.懒汉式(延时加载)
 *在类被加载时 不会被创建对象
 *只有当 你调用了获取对象方法的时候
 *才会创建对象
 */
// 饿汉式(只要该类被加载 就会在方法区静态区中 创建本类对象)

class SingleE {

	// 声明一个本类的对象

	private static SingleE singleE = new SingleE();



	// 构造方法私有化

	private SingleE() {



	}



	// 对外提供一个访问的方法(就是为了返回本类的对象)

	public static SingleE getInstance() {

		return singleE;

	}

}

// 懒汉式 (不完整 线程安全问题)

class SingleL {
	// 声明一个对象的引用
	private static SingleL singleL = null;

	private SingleL() {

	}

	// 获取对象的方法
	public static SingleL getInstance() {
		// 判断 当这个对象不存在的时候 再创建
		if (singleL == null) {
			singleL = new SingleL();
		}
		return singleL;
	}

2.模板模式

模板设计模式
 * 
 * 大部分东西一样 只需要修改一部分内容
 * 简历的抬头 
 * 简历的名字-----修改
 * 简历的内容
 *  
 *来蓝欧学习
 *报名缴费
 *选择学科(H5 JAVA U3D)
 *毕业找工作 
abstract class LOStudy{
	//学习方法
	public void study() {
		System.out.println("报名缴费");
		//选择学科是需要变化的 声明一个方法
		//调用抽象方法
		chooseSubject();
		System.out.println("毕业找工作");
	}
	//声明抽象方法 提出来
	public abstract void chooseSubject();
}

class LSK extends LOStudy{
	//重写抽象方法
	 @Override
	public void chooseSubject() {
		 System.out.println("学JAVA");
	}
}

class PQ extends LOStudy{
	@Override
	public void chooseSubject() {
		System.out.println("学H5");
	}
}


public static void main(String[] args) {
		LOStudy lsk = new LSK();
		lsk.study();
	}

3.接口

狭义:java中的接口
 * 使用interface关键词 来声明
 * interface 接口名{
 * 
 * }
 * 广义:相当于一个规则 规范 是需要来遵守的
 * (蓝欧学生手册)(保密协议)
 * 
 * 接口
 * 1.只可以声明抽象方法(是不准确的JDK1.8之前)
 * 2.可以声明一个 变量
 * 3.接口只能用来实现(不能继承)
 * 4.接口中是没有构造方法的
 * 5.接口中声明变量默认是public static final
 *  默认就是静态常量
 *  建议:先写全 写熟了再说 主要看公司规定.
 *  6.声明抽象方法时 默认是 public abstract(可省略)
 * 
 * 接口咋运行的? 
 * 跟类一样 也会被翻译成 .class文件
public class Demo03 {
	public static void main(String[] args) {
		//创建接口 使用多态的形式创建
		InterA interA = new InterAImpl();
		interA.fun();
		System.out.println(InterA.num);
	}

}
//声明一个接口
interface InterA{
	public static final int num = 10;
	public abstract  void fun();
}

//接口 使用implements 关键词 实现
//接口的实现类 类名 一般都以Impl结尾
class InterAImpl implements InterA{
	//实现接口中 抽象方法
	@Override
	public void fun() {
		System.out.println(num);
		System.out.println("我是实现类的 fun方法");
	}
}


动物(抽象类)
 * 吃 叫
 * 训练动物(接口)
 * 跳高
 * 猫
 * 吃猫粮 喵喵
 * 加菲猫
 * 训练猫
 * 
 * 抽象类 和 接口有什么区别?
 * 1.使用方法
 * 抽象类:继承
 * 接口:实现
 * 2.成员变量
 * 抽象类:可以使变量 变量
 * 接口:只能是常量
 * 3.成员方法
 * 抽象类:可以是 抽象方法 也可以是成员方法
 * 接口:只能是抽象方法(静态方法 和 默认方法)
 * 4.构造方法
 * 抽象类:有
 * 接口:无
 * 
 * 类与类之间的关系(亲爹的关系)
 * 只允许单继承
 * 
 * 类和接口关系(干爹的关系)
 * 实现的关系 可以多实现
 * 
 * 
 * 接口和接口的关系
 * 可以单继承 也可以多继承
 * 
 */

//类和接口的关系
interface InterB{
	public abstract void fun1();
}

interface InterC{
	public abstract void fun2();
}

class TestA implements InterB,InterC {

	@Override
	public void fun2() {
		
	}

	@Override
	public void fun1() {
			
	}
	
}

//接口和接口的关系
interface InterD{
	public abstract void fun1();
}

interface InterE{
	public abstract void fun2();
}

interface InterF extends InterE,InterD{
	
}
class InterFImpl implements InterF{
	@Override
	public void fun2() {
		
	}

	@Override
	public void fun1() {
		
	}
	
}

abstract class Animal{
	public  abstract  void eat();
	public  abstract  void speak() ;
}
class Cat extends Animal{
	@Override
	public void eat() {
		System.out.println("吃猫粮");
	}
	@Override
	public void speak() {
		System.out.println("喵喵喵");
	}
}
//猫的接口
interface InterCat{
	public abstract void jump();
}
 
class JFCat extends Cat implements InterCat  {
	//需要实现接口中的方法 先继承后实现
	@Override
	public void jump() {
		System.out.println("我能跳,我能摸到篮板");
	}
}

public static void main(String[] args) {
		Animal jfAnimal = new JFCat();
		jfAnimal.eat();//吃
		jfAnimal.speak();//说
		//向下转型
		JFCat jfCat = (JFCat)jfAnimal;
		jfCat.jump();
		
	}

4.抽象类

抽象类:描述不清楚就是抽象
 * 关键词:abstract
 * abstract 可以修饰 类 该类就是 抽象类
 * abstract 可以修饰方法 该方法就是 抽象方法
 * 当你对这个方法 描述的不是特清楚(不知写啥)
 * 就可以直接把该方法 声明成 抽象方法
 * 注意:抽象方法没有方法的实现部分
 * 注意: 1.有抽象方法的 必须是抽象类
 * 		2.但是抽象类中 不一定要有抽象方法
 * 		3.抽象类 不能直接创建对象
 * 		4.强制子类 重写父类的抽象方法
 *      5.创建的时候使用多态的形式进行创建
抽象类有啥用?
 * 核心:抽象类 不能直接使用 只能使用抽象类的子类
 * 
 * 为什么抽象类 允许构造方法的存在?
 * 保证继承的完整性
抽象类中有
 * 1.可以有变量 常量
 * 2.可以有构造方法
 * 3.可以有 抽象方法 和 成员方法

// 抽象类
abstract class Animal {
	final int num = 0;
	// 构造方法
	public Animal() {
		System.out.println("我是Animal 无参的构造方法");
	}

	// 声明一个抽象方法
	public abstract void speak();

	public void fun() {
		System.out.println("我是fun方法");
	}

}

// 抽象类的子类
class Cat extends Animal {
	// 子类重写父类的 抽象方法
	@Override
	public void speak() {
		System.out.println("喵喵喵");
	}
public static void main(String[] args) {
		// 创建一个动物对象
		
		//抽象类如何使用
		//使用多态的创建方式
		//父类的引用指向子类的对象
		Animal aCat = new Cat();
		aCat.speak();
	}









猜你喜欢

转载自blog.csdn.net/weixin_42120532/article/details/80329576