java郭德綱(「郭德綱」)

本文目錄一覽:

為什麼JavaWeb項目要分層

首先讓我們坐着時光機回到n年前的web開發。

那個時候最早都是靜態的html頁面,後來有了數據庫,有了所謂的動態頁面,

然後程序猿在編碼的時候,會把所有的代碼都寫在頁面上,包括數據庫連接,包括事務控制,接收參數,各種校驗,各種邏輯,各種html/js/css代碼等等

怎麼樣?夠亂吧?像一坨那什麼一樣,這個頁面可能有成千上萬行?

那麼好,問題來了,回頭需要修改的時候,你怎麼辦?

你找個東西找半天,好不容易找到了,還不敢改,怕被其他地方用了,改出連帶問題。

頁面一出錯,定位不準到底是哪裡的問題,從頭到尾的挨個排查。

等等等等。

這就是大家常說的什麼叫可維護性,這也是為什麼越來越多的公司的規範要求不能寫複雜sql。

還記得之前在東軟的時候,一哥們寫了一個80多行的大sql來完成一個核心的查詢。

試問這個大sql天天在數據庫里run,還有性能可言?

再試問誰敢改?

後來項目要改需求還是出現bug了,那個sql要改動,寫sql的哥們改了好久才改好,因為時間長他也忘了,

再後來他離職了。。。

有人問,那簡單sql實現不了我的功能呀,怎麼辦?

從數據庫設計層面開始下手,要允許適當的冗餘,把表弄好,就迎刃而解了,這也是數據庫層面的一種解耦吧。

後來。。。

進入第二階段,大家痛定思痛,決定要把頁面和邏輯拆開,頁面只是負責顯示,邏輯都在後台。

這就出現了短暫的,在jsp里使用標籤調用bean的用法。bean里耦合了除了頁面之外的所有東西。

再後來。。。

進入了第三階段,大家又痛定思痛,決定要拆成三部分,就是大名鼎鼎的MVC。

再再後來。。。

衍生出來了類似於struts/springmvc等等的mvc框架

—————

JavaWeb項目的層有2個維度。

第一個維度是MVC的三層:

M:model,模型層,包括了你的業務邏輯和數據庫操作,封裝好給視圖層使用的。

V:view,視圖層,僅僅做的是展示數據,不包含業務邏輯,主要是jsp/html等等

C:controller,控制層,負責接收請求,調用模型層處理業務邏輯並返回給視圖層。

第二個維度是java代碼里的三層:

controller:控制層,負責接收參數/解析參數/封裝參數,調用serivce,將service方法的返回值進行封裝(如果需要),返回數據/返回頁面,路由。

service:負責業務邏輯,事務控制在這層里做,被controller調用,以及調用dao。

dao:持久層,負責數據庫交互,被service調用。

這2個維度別弄混了喲。我今天主要說的是第二個維度的層喲。

我認為,第二個維度是第一個維度的延伸,其實第二個維度再加上一個表現層就完美了,這就為什麼有人說是4層架構。

—————

前戲結束,步入正題:

有些學生朋友可能會問為什麼要分層呢?我本來可以在一個地方寫完的東西,非要散落在各個層中,都在一起不是挺好的嗎?

開發效率高呀~

跳來跳去的我腦子都暈啦。。。

這就是為什麼有人會把所有的東西都扔在一個層里,比如controller層。。。

其實我們可以在jsp上把所有的邏輯以及數據庫操作,數據展示全部寫在一起,耦合在一起,這樣開發起來貌似更快,

但是維護性非常差,有朝一日想改一個小地方,牽一髮而動全一身,隱患很高,無法快速定位問題。

因此我們需要分層。

分層了之後,你理論上改了持久層的東西,邏輯層是不用變動的。

每個Dao類是跟每個表走,Dao的每個方法里就一個個的簡單sql,不包含任何業務邏輯,可以被不同的service復用和調用。

經過抽象後基本上都是通用的,因而我們在定義DAO層的時候可以將相關的方法定義完畢,

這樣的好處是在對Service進行擴展的時候不需要再對DAO層進行修改,提高了程序的可擴展性。

提高了程序的可擴展性。具體什麼時候做這些操作,怎麼做這些操作都由Service來處理。

(就像郭德綱的相聲里的一句話:「行了,你甭管了」)

而Service則不是,一個Service里可以會調用多個不同的dao,完成特定的業務邏輯,事務控制,

封裝Service層的業務邏輯有利於通用的業務邏輯的獨立性和重複利用性

同時,一個Service的方法也有可能被多個Controller的方法來調用。

邏輯出問題就在Service找問題,數據庫,sql有問題就在Dao層找問題,

參數解析錯誤,跳轉錯誤,就在Controller上找問題。

這樣快速定位問題,互不干擾。

—————

分層架構(這裡會延伸到更廣闊的架構):

回頭項目玩大了,怎麼辦?拆!!!

具體可以搜一下:maven分模塊開發,怎麼玩代碼依賴,怎麼玩微服務,怎麼玩SOA,怎麼玩RPC,怎麼玩dubbo。

web項目發展有幾個階段啊

第一個階段(單一應用架構):

所有代碼都耦合在一個項目里,放在一台服務器上,這種all in one的方式是有好處的。

創業初期,不用什麼架構,走敏捷開發,最快速的實現需求才是王道。

你甭管我有多爛,我至少能跑起來,我至少能在外網上讓你訪問,讓你使用。

當然了,初期的訪問量很少,節省部署和運維成本才是王道呀。

聽阿里的講座,說淘寶的前期的版本用的就是一台PC機作為服務器,所有的功能耦合在一個項目里,

每次往生產環境上發版本,要上傳一個600mb的包,呵呵。

第二個階段(垂直應用架構):

哎喲,不錯哦。自己的兒子被越來越多的人訪問,訪問量激增,一台服務器扛不住了,

沒事,我們可以玩負載均衡,玩集群。

但是!這種性能加速度其實會變得越來越小,因為你的項目是耦合在一起的。

這時,我們需要拆分項目,這裡又有2個維度,按層拆,按模塊拆。

將拆好的不同項目分別部署在不同的服務器上,並且再分不同的小集群。

第三個階段(分佈式服務架構):

唉呀媽呀,訪問量陡增,到這步你創業應該算成功了,開始燒投資人的錢了吧。

經過上面拆成了越來越多的模塊,模塊與模塊交互越來越多,怎麼辦?

這個時候我們需要把核心的業務抽出來,作為獨立的服務,慢慢發展成穩定的服務中心,

用來提升業務復用和整合。

就像阿里的大牛說過,沒有淘寶的積累,天貓能那麼快的出來嗎?

這個時候,你的緩存,數據庫,消息隊列等服務都應該是分佈式的。

第四個階段(流動計算架構)

哎呀媽呀,訪問量又上了一個台階,翻了好幾百倍吖,腫么辦?

這個時候服務越來越多,一些容量和資源的浪費問題凸顯出來,

這時我們需要一個調度中心來基於訪問壓力動態的管理集群容量,

提高利用率。

第五個階段(雲計算架構)

抱歉,作者正在學習中,未完待續。

現在選擇去學習java還有前途嗎?培訓機構那麼多,每月都培訓出來很多人,都不值錢了吧?

學到了就是自己的.

是這樣,

在培訓機構學習的時候,

他們教給了我們關於這門計算機語言的基礎知識,

好一點的培訓機構會引導我們學會如何學習計算機語言.

所有計算機語言都是相通的.

面向對象思想已經普遍應用於各種計算機語言了,

學精了你會發現計算機語言就是我們的人類語言(寫代碼就跟平時說話一樣簡單).

計算機語言用得好的人會非常出色,

就像相聲演員郭德綱.

想必你見過會怯場會緊張一說話就磕巴的人,

這樣他不可能成為相聲演員,但他絕對可以成為一名出色的程序員,項目經理,黑客大師,或者比爾蓋茨?

高分急求java撲克出牌代碼

我不知道電腦出牌為什麼要進行大小比較以及刪牌操作? 我的是52張牌若干玩家,隨機發牌給玩家,玩家收到電腦發的牌。

這個是定義52張牌:Card.java

package com.etc.week4.day03;

public class Card {

// 點數 3 —0 4 1 12 2 11 A 13 小王 14 大王

public int rank;

public final static int THREE = 0;

public final static int FOUR = 1;

public final static int FIVE = 2;

public final static int SIX = 3;

public final static int SEVEN = 4;

public final static int EIGHT = 5;

public final static int NINE = 6;

public final static int TEN = 7;

public final static int JACK = 8;//J

public final static int QUEEN = 9;//Q

public final static int KING = 10;//K

public final static int ACE = 11;//A

public final static int DEUCE = 12; //2

public final static int BLACK = 13; //小王

public final static int COLOR = 14;//大王

//花色(suit=0suit=4)

private int suit;

public final static int CLUB = 0; //梅花

public static final int DIAMOND = 1; //方塊(鑽石)

public static final int HEART = 2; //紅桃(紅心)

public static final int SPADE = 3; //黑桃(花鋤)

public static final int JOKER = 4; //王

public Card(int suit,int rank){

this.setSuit(suit);

this.setRank(rank);

}

public Card(){}

public int getRank() {

return rank;

}

public void setRank(int rank) {

if(rankCard.THREE||rankCard.COLOR){

throw new RuntimeException();

}

this.rank = rank;

}

public int getSuit() {

return suit;

}

public void setSuit(int suit) {

if(suitCard.CLUB || suitCard.JOKER){

throw new RuntimeException();

}

this.suit = suit;

}

// 點數對應 名稱

public final static String[] RANK_NAMES={

“3”,”4″,”5″,”6″,”7″,”8″,”9″,”10″,”J”,”Q”,

“K”,”A”,”2″,”小王”,”大王”};

public final static String[] SUIT_NAMES={

“梅花”,”方塊”,”紅桃”,”黑桃”,””};

@Override

public String toString() {

return SUIT_NAMES[this.suit]+RANK_NAMES[this.rank];

}

public static void main(String[] args) {

Card c =new Card(HEART, ACE);

System.out.println(c);

}

}

這個是定義若干玩家Player.java

package com.etc.week4.day03;

import java.util.Arrays;

public class Player {

String id;

String name;

Card cards[] ={};

public void addCards(Card card ){

// 每個玩家獲取的牌

cards = Arrays.copyOf(cards, cards.length+1);

cards[cards.length-1] = card;

}

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public Card[] getCards() {

return cards;

}

public void setCards(Card[] cards) {

this.cards = cards;

}

public Player(String id, String name) {

this.id = id;

this.name = name;

}

public Player() {

super();

}

@Override

public String toString() {

return “Player:”+name+” cards=”

+ Arrays.toString(cards) + “]”;

}

}

這個是電腦隨機發牌給玩家,玩家收到電腦發的牌PlayDemo.java

package com.etc.week4.day03;

import java.util.Arrays;

import java.util.Random;

public class PlayerDemo {

public static void main(String[] args) {

// 創建一副撲克牌

// 方塊:13張(THREE~DEUCE)

// 梅花:13張(THREE~DEUCE)

// 黑桃:13張(THREE~DEUCE)

// 紅桃:13張(THREE~DEUCE)

// 王: BLACK COLOR

Card [] cards = new Card[54];

int i=0;

// 構造52張普通的牌

for(int rank=Card.THREE;rank=Card.DEUCE;rank++){

cards[i++] = new Card(Card.DIAMOND, rank);

cards[i++] = new Card(Card.CLUB, rank);

cards[i++] = new Card(Card.SPADE, rank);

cards[i++] = new Card(Card.HEART, rank);

}

// 添加 大小王

cards[i++] = new Card(Card.JOKER, Card.BLACK);

cards[i++] = new Card(Card.JOKER, Card.COLOR);

// 將數組 變成集合 List

// List arr= Arrays.asList(cards);

// 將集合裏面的元素 打亂… 洗牌

//Collections.shuffle(arr);

// 洗牌//

for(int n=cards.length-1;n=1;n–){

Random rd = new Random();

int index = rd.nextInt(n); //1 0

Card t = cards[n];

cards[n] = cards[index];

cards[index] = t;

}

// System.out.println(“=====測試洗牌…..\n”+Arrays.toString(cards));

// 組建玩家團隊

Player[] players = new Player[4];

players[0] = new Player(“1010”, “張柏芝”);

players[1] = new Player(“1011”, “曾志偉”);

players[2] = new Player(“1012”, “譚詠麟”);

// players[3] = new Player(“1013”, “郭德綱”);

// 發牌…..

for(int j =0;jcards.length;j++){

players[j%players.length].addCards(cards[j]);

}

// 顯示各個玩家的牌

for(int m=0;mplayers.length;m++){

System.out.println(players[m]);

}

}

}

用eclipse寫的

在Person類中,沒有跟Dog屬性設置值的方法,在夠着函數中雖然有this.dog = dog;但是沒有地方傳入值進去。

你可以在構造函數中添加傳入參數Dog dog,然後在main中實例化Person的時候也傳入。即

Person類:

public Person(int age,String name,Dog dog )

{

this.age = age;

this.name = name;

this.dog = dog;  

}

main方法:

Person p1 = new Person(23,”郭德綱”,dog);

2.在Person類中寫個set方法,然後在main中添加給person對象賦dog值的代碼。

Person類:

public void setDog(Dog dog){this.dog=dog;}

main方法:

在Person p1 = new Person(23,”郭德綱”);後面加上

p1.setDog(dog);

3.其實可以直接這樣。。

在main方法中:

在Person p1 = new Person(23,”郭德綱”);後面加上

p1.dog=dog;

lz三個的方法,你看到辦就是了。。純手工啊

求大神幫幫忙,今天考java不會做這個題,小弟謝謝了

package clent;

import java.util.Scanner;

public class Department {

private String id;

private String name;

public Department(String id,String name){

this.id=id;

this.name=name;

}

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public static void main(String agrs[]){

Department d = new Department(“00001″,”銷售部”);

System.out.println(“部門信息  部門編號:”+d.getId()+”,  部門名稱:”+d.getName());

Employee e = new Employee(“0003″,”郭德綱”,2000,d);

System.out.println(“員工信息  員工編號:”+e.getId()+”,  姓名:”+e.getName()+”,  底薪:”+e.getSalary()+”,  所在部門:”+e.getDepart().getName());

Scanner s = new Scanner(System.in);

System.out.println(“請輸入”+e.getName()+”本月銷售額:”);

int num = s.nextInt();

e.SumSalary(num);

}

}

package clent;

public class Employee {

private String id;

private String name;

private int salary;

private Department depart;

public void SumSalary(int num){

if(num100000){

System.out.println(name+”本月的工資為”+(int)(salary+num*0.01)+”元”);

}

if(num100000  num 200000){

System.out.println(name+”本月的工資為”+(int)(salary+num*0.02)+”元”);

}

if(num=200000){

System.out.println(name+”本月的工資為”+(int)(salary+num*0.03)+”元”);

}

}

public Employee() {

}

public Employee(String id, String name, int salary, Department depart) {

super();

this.id = id;

this.name = name;

this.salary = salary;

this.depart = depart;

}

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getSalary() {

return salary;

}

public void setSalary(int salary) {

this.salary = salary;

}

public Department getDepart() {

return depart;

}

public void setDepart(Department depart) {

this.depart = depart;

}

}

以上就是代碼了,測試成功了。

原創文章,作者:簡單一點,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/130919.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
簡單一點的頭像簡單一點
上一篇 2024-10-03 23:27
下一篇 2024-10-03 23:27

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發佈。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論