Creational(创造性模式)——创建对象
Structural(结构性模式)——对象之间的关系
Behavioual(行为性模式是)—— 对象的行为或者交互方面内容
面向对象四个原则:封装、抽象、继承、多态
耦合:表达了一个类对另一个类的依赖度是多少
Java及UML简述
一、类
public class Main {
public static void main(String[] args) {
//如此时的User与Main就是耦合状态,如果有成千上万个类,耦合越高,越难修改和扩展
//——程序应当用低耦合形式——使用接口
User user = new User("Me ");
// user.name = "Me";
// System.out.println(user.name);
user.sayHello();
}
}
public class User {
//属性
public String name;
public User(String name){
this.name = name;
}
//方法
public void sayHello(){
System.out.println("My name is" + name);
}
}
二、接口:要求类必须提供某些能力的约定
image.png
Main
/**
* 税款计数器——如可以开发一个2019的计算机,或者2020的计算机,但是这些计算机都有共同的特定——都可以计算税款——这时就需要接口来表示
* 在程序中,我们不需要使用固定的类,我们要使用接口,这就叫面向接口编程
* 每次我们在程序中需要一个税款计算机,我们就使用接口
*/
public class Main {
public static void main(String[] args) {
//这样,这个类就和这个接口有关系,也就是耦合了
TaxCalculator calculator = getCalculator();
//这个接口很小(只有一个方法),只要以后我们不改变这个方法的名字,这里就不会出现因修改引发的中断,就是低耦合
calculator.calculateTax();
}
//使用static,Main方法才能直接访问它
public static TaxCalculator getCalculator(){
return new TaxCalculator2019();
}
}
Inferface
public interface TaxCalculator {
//就好像在说,如果你想创建税款计算器类,这个类就应该有这样一个方法
float calculateTax();
}
实现类
public class TaxCalculator2020 implements TaxCalculator{
@Override
public float calculateTax() {
return 2;
}
}
public class TaxCalculator2019 implements TaxCalculator {
@Override
public float calculateTax() {
return 1;
}
//我们改变了这个类,但是这种改变对这里的main方法没有影响
//因为我们编程是面向接口,而不是面向具体的类
public float calculateInstance(){
return 0;
}
}
三、封装:
封装就是在一个类中绑定字段和操作字段的方法,并在类的外部隐藏字段的数据或者说状态,我们能防止对象的状态变得不可预知——封装的原则
Account类
public class Account {
private float balance;
//deposit:存款
public void deposit(float amount){
if(amount>0)
balance += amount;
}
//withdraw:支出
public void withdraw(float amount){
if(amount>0)
balance -= amount;
}
//获得余额的方法——读取器getter
public float getBalance() {
return balance;
}
//设置字段的值——设置器setter
// public void setBalance(float balance) {
// if (balance > 0)
// this.balance = balance;
// }
}
main类
public class Main {
public static void main(String[] args) {
//new对象需要用两次类的名字,所以改为var更好
var account = new Account();
//balance不应该有负数,所以需要封装性
// account.balance = -1;
account.deposit(10);
account.withdraw(5);
System.out.println(account.getBalance()); //5.0
}
}
四、抽象
抽象的意思,就是我们对外隐藏类当中不必要暴露的细节
(遥控器:我们并不直接操作主板里面的转换器,他们实现了控制细节,我们并不想关心这些细节,我不想搞清楚,当我按开机键时,遥控器内部发生了什么——这就是抽象原则的具体实现)
main类
public class Main {
public static void main(String[] args) {
var mailService = new MailService();
//使用者并不关心怎么连接到服务器,怎么验证账号的合法性,我只关心发送邮件的能力——
//这时候就需要抽象化
mailService.sendEmail();
}
}
MailService 类
public class MailService {
//现实中应当传入一个Email对象
public void sendEmail() {
connect();
authenticate();
//Send email
disconnect();
}
/*
全部更改为private
这时候我们就算修改任何的私有方法,main方法这里都不会受影响
*/
//连接
private void connect() {
System.out.println("Connect");
}
//关闭连接
private void disconnect() {
System.out.println("Disonnect");
}
//验证
private void authenticate() {
System.out.println("Connect");
}
}
五、继承:实现代码的复用;继承是一种机制,允许我们跨类重复使用代码
使用:可以在一个基类/父类实现这些方法,然后让子类继承它
Main类
public class Main {
public static void main(String[] args) {
var textBox = new TextBox();
//我们没有在文本框类实现,但是在UI控件类实现了
//但是,文本框类从它的父类,UI控件类当中将这个方法继承过来了
textBox.enable();
}
}
UIControl类(父类)
public class UIControl {
//现在我们需要先创建激活组件,以及让组件失效的能力
public void enable() {
System.out.println("enable");
}
}
TextBox类
public class TextBox extends UIControl{
}
六、多态(Polymorphism):poly的意思是很多,morph意思是形态,所以多态的意思是多种形态----一个对象展现多种形态
使用:一个对象可以展现多种形象
实现类
public class CheckBox extends UIControl {
@Override
public void draw() {
System.out.println("drawing a CheckBox");
}
}
public class TextBox extends UIControl{
@Override
public void draw() {
System.out.println("drawing a TextBox");
}
}
UIControl类(父类)
public abstract class UIControl {
//现在我们需要先创建激活组件,以及让组件失效的能力
public void enable() {
System.out.println("enable");
}
//如何渲染组件,取决于组件的具体类型
//1.抽象方法不能有代码块 2.抽象方法应该在一个抽象类
public abstract void draw();
}
Main类
public class Main {
public static void main(String[] args) {
drawUIControl(new TextBox()); //drawing a TextBox
drawUIControl(new CheckBox()); //drawing a CheckBox
}
public static void drawUIControl(UIControl uiControl){
uiControl.draw();
}
}
七、UML:Unified Modeling Language——标准建模语言,用来给系统建模的标准语言——表达类与类之间的关系
image.png
继承关系
image.png
组合型关系
image.png
image.png
(还有一种聚合关系)
依赖性关系
image.png
image.png
image.png
三种关系
image.png